【问题标题】:Is there a function to only assign properties on a destination if the property exists?如果属性存在,是否有仅在目标上分配属性的功能?
【发布时间】:2019-04-02 23:30:10
【问题描述】:

这可能是一个白日梦,但我希望有一个 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 的版本,它允许我指定我希望一个对象的属性成为“先例”,并且源对象上的所有属性都不会出现在先例应该被忽略。

【问题讨论】:

  • const magicalFunction = (obj1, obj2) => { for (const k of Object.keys(obj1)) { if (k in obj2) { obj1[k] = obj2[k]; } } return obj1; } --- 字面意思是 3 行代码

标签: javascript object lodash


【解决方案1】:

是的,您可以这样做 - 遍历源对象的 Object.keys,并检查替换器对象上是否有同名的属性 - 如果有则替换,如果没有则不要:

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);

【讨论】:

  • 试试let obj2 = { prop2: '' }
【解决方案2】:

您可以使用 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>

【讨论】:

  • 谢谢你,我接受 Jack Bashford 的回答,因为它比你的早一点,虽然我确实说 lodash 没问题,但他都是原生 JS。不过,这是一个非常优雅的解决方案!
【解决方案3】:

给你:

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;
}

此函数迭代两个对象的键,如果 obj2 中的键也在 obj1 中找到,则覆盖该值。

希望它是您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2012-05-21
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多