这可能是个白日梦,但是我很喜欢执行以下操作的JavaScript(或lodash?)函数:
let obj1 = {
prop1: 'first thing',
prop2: 'second thing'
};
let obj2 = {
prop2: 'overridden second thing',
prop3: 'and another thing'
};
let result = magicalFunction(obj1, obj2);
// result is { prop1: 'first thing', prop2: 'overridden second thing' }
换句话说,我需要一个Object.assign
版本,该版本允许我指定我希望一个对象的属性为“先例”,而源对象上的所有属性都不会出现在先例中应该被忽略。
答案 0 :(得分:2)
是的,您可以执行-遍历源对象的Object.keys
,并检查替换对象上是否存在具有相同名称的属性-替换是否存在,而不替换't:
let obj1 = {
prop1: 'first thing',
prop2: 'second thing'
};
let obj2 = {
prop2: 'overridden second thing',
prop3: 'and another thing'
};
let result = magicalFunction(obj1, obj2);
function magicalFunction(source, replacer) {
let output = {};
Object.keys(source).forEach(key => output[key] = replacer[key] || source[key]);
return output;
}
console.log(result);
答案 1 :(得分:1)
您可以使用lodash的_.pick()
和_.keys()
(或Object.keys()
)从第二个对象获取仅存在于第一个对象中的键。您可以使用对象传播将原始对象与拾取的键合并:
const magicalFunction = (a, b) => ({ ...a, ..._.pick(b, _.keys(a)) });
const obj1 = {
prop1: 'first thing',
prop2: 'second thing'
};
const obj2 = {
prop2: 'overridden second thing',
prop3: 'and another thing'
};
const result = magicalFunction(obj1, obj2);
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
答案 2 :(得分:0)
您在这里:
function magicalFunction (obj1, obj2) {
let keys1 = Object.keys(obj1);
let keys2 = Object.keys(obj2);
for(let i=0; i<keys2.length; i++) {
if(keys1.indexOf(keys2[i]) > -1) {
obj1[keys2[i]] = obj2[keys2[i]];
}
}
return obj1;
}
此函数迭代两个对象的键,如果在obj1中也找到obj2中的键,则该值将覆盖。
希望这就是您想要的。