我希望在更改名称时将属性从objA
转移到objB
,并且只有在 truthy 时才会覆盖。使用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}
是否有一种不那么人为的方法呢?
答案 0 :(得分:1)
两种解决方案都使用Map重命名数组键,Object#assign合并对象(片段不支持对象休息/传播)。
<强> 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>