更新具有匹配属性的对象并忽略新属性。

10
我正在使用Typescript,想要将一个对象与另一个对象进行更新,仅在匹配的键上进行更新。

// Destination
objectOne = {
  a: 0,
  b: 0,
};

// Source
objectTwo = {
  a: 1,
  b: 1,
  c: 1,
};

// Expected
result = {
  a: 1,
  b: 1,
};

// Current solution
const current = {};
Object.keys(objectTwo).forEach(key => key in objectOne ? current[key] = objectTwo[key] : null);

console.log(current);

有没有一行代码(不是自定义函数,不需要迭代键),可以忽略源中的属性 c ?我还想避免使用诸如lodash或JQuery之类的库。 重复编辑我的问题不是关于合并两个对象的问题,而是关于忽略第二个对象中不在第一个对象中的字段的问题。

1
@Mium 完全不是。我不想加入它们。我试图忽略新的字段,这正好与你引用的问题相反。 - user4676340
依我看,你的解决方案相当简短易读,这也是我在这种情况下所做的。让我们看看,是否还有更简洁的方式... - P.S.
1
这个 Object.keys(objectOne).reduce((r,k) => (r[k] = k in objectTwo ? objectTwo[k] : objectOne[k], r) , {}); 怎么样? - Hassan Imam
@Hassan 这基本上与我的当前解决方案相同,即自定义函数,这是我想避免的。 - user4676340
是的,基本上是这样。 - Hassan Imam
显示剩余4条评论
3个回答

6

在没有得到答案一段时间后,似乎我提供的最短解决方案是最好的:

Object.keys(newObj).forEach(key => key in oldObj? result[key] = newObj[key] : null)

0
const result = Object.keys(objectOne)
    .reduce((init, key) => Object.assign(init, {[key]: objectTwo[key]}) , {});

再次强调,这是一个自定义函数,我希望避免使用这种方式。我想要的是一种内置函数,比如 Object.assign,但它会忽略新的字段。 - user4676340
没有注意到你的编辑,所以答案不相关。 - Reuven Chacha
1
仍然保留它,因为它可能会帮助正在寻找它的某个人! - user4676340
如果objectOne具有objectTwo没有的属性,则此操作将失败,使这些属性变为undefined - OfirD

0

我认为没有内置函数可以完成你需要的操作,而是需要使用自定义函数来迭代第一个对象的键和第二个对象的值:

const objectOne = {
  a: 0,
  b: 0
};

const objectTwo = {
  a: 1,
  b: 1,
  c: 1,
};

const result = Object.keys(objectOne).reduce((all, key) => {

    all[key] = objectTwo[key] || objectOne[key];

    return all;

},{});

console.log(result);

2
好的,那么我能做的最好的就是继续使用当前的解决方案...感谢你的建议。 - user4676340

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接