是否存在仅在目标上分配属性的功能?

时间:2019-04-02 23:30:10

标签: javascript object lodash

这可能是个白日梦,但是我很喜欢执行以下操作的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版本,该版本允许我指定我希望一个对象的属性为“先例”,而源对象上的所有属性都不会出现在先例中应该被忽略。

3 个答案:

答案 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中的键,则该值将覆盖。

希望这就是您想要的。