【问题标题】:Set object properties if truthy in Javascript如果在 Javascript 中为真,则设置对象属性
【发布时间】:2018-04-30 20:32:43
【问题描述】:

我想将属性从objA 转移到objB,同时更改它们的名称 并仅在它们真实 时覆盖。使用 lodash 但 ES6 解决方案会更好。

这是我目前所拥有的:

// My initial objects
const objA = {a: 1, b: '', c: null};
const objB = {x: 7, y: 8, z: 9};

// Extracting and renaming
let {x: a, y: b, z: c} = obj1;

// Sanitizing
const temp = _.pickBy({x, y, z}, _.identity);

// Merging A and B
return {...objB, ...objA}; // {x: 1, y: 8, z: 9}

有没有更不做作的方法?

【问题讨论】:

  • 似乎使用地图会更明智。
  • FWIW,{...objB, ...objA} 不是有效的 ES6。对象传播是一个提议。如果您愿意接受使用实验性功能的答案,您应该使用ecmascript-next 标记您的问题。
  • objB 总是键 {x, y, z}?

标签: javascript object ecmascript-6 lodash


【解决方案1】:

两种解决方案都使用Map 重命名数组键,使用Object#assign 合并对象(sn-ps 不支持对象休息/传播)。

ES2017

使用Object#entries (ES2017) 获取objA 的键和值,仅在值不为假的情况下重命名和添加。

const a2x = new Map([['a', 'x'], ['b', 'y'], ['c', 'z']]);

const objA = {a: 1, b: '', c: null};
const objB = {x: 7, y: 8, z: 9};

const result = Object.assign({}, objB, 
  Object.entries(objA).reduce((r, [k, v]) => v ? 
    Object.assign(r, { [a2x.get(k)]: v }) : r, {}));

console.log(result);

lodash:

使用_.mapKeys() 更改键名,然后使用_.pickBy()_.identity() 删除虚假值。

const a2x = new Map([['a', 'x'], ['b', 'y'], ['c', 'z']]);

const objA = {a: 1, b: '', c: null};
const objB = {x: 7, y: 8, z: 9};

const result = Object.assign({}, objB, 
  _.pickBy(_.mapKeys(objA, (v, k) => a2x.get(k)), _.identity));

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 2016-12-03
    • 2021-07-19
    • 2017-07-12
    • 2015-03-14
    • 2013-07-25
    • 2019-03-24
    相关资源
    最近更新 更多