使用es6从两个对象中获取差异对象

Tom*_*atz 5 javascript object ecmascript-6 ecmascript-2016

我试图找出使用 es6 获取两个对象之间的交集对象的最佳方法是什么。我的意思是:

a = {a:'a',b:'b',c:'c', d:'d'};
b = {a:'a',b: '1', c:'c', d:'2', f'!!!'}
// result I want:
c = getDifference(a,b)
//c is now: {b:'1', d:'2'}
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以使用 es6 来做到这一点,或者我是否需要使用 for(in) 和 Object.keys() 迭代 a 对象并进行比较,将交集分配给 c?

(a,b) => {
    const c = {};
    for(const _key in Object.keys(a)){
       if(b[_key] && b[_key] !== a[_key]){
           c[_key] = b[_key];
       }
    }
    return c;
}
Run Code Online (Sandbox Code Playgroud)

我知道 loadash/underscore 有这些类型的辅助函数...但是尝试看看 es6 是否有任何新的短语法,如果没有,使用 vanilla js 执行此操作的最短方法是什么。

Nic*_*ons 9

b你可以使用 using获取对象的条目,然后过滤掉与usingObject.entries()相同的键值对,然后,你可以使用如下命令重建你的对象:a.filter()Object.fromEntries()

const a = {a:'a',b:'b',c:'c', d:'d'};
const b = {a:'a',b: '1', c:'c', d:'2', f:'!!!'}

const getDifference = (a, b) => 
  Object.fromEntries(Object.entries(b).filter(([key, val]) => key in a && a[key] !== val));


// result I want:
const c = getDifference(a,b); // peforms b-a
console.log(c); // {b:'1', d:'2'}
Run Code Online (Sandbox Code Playgroud)

如果您不支持Object.fromEntries(),那么您可以使用.reduce()来为您构建对象:

const a = {a:'a',b:'b',c:'c', d:'d'};
const b = {a:'a',b: '1', c:'c', d:'2', f:'!!!'}

const getDifference = (a, b) => 
  Object.entries(b).filter(([key, val]) => a[key] !== val && key in a).reduce((a, [key, v]) => ({...a, [key]: v}), {});


// result I want:
const c = getDifference(a,b); // peforms b-a
console.log(c); // {b:'1', d:'2'}
Run Code Online (Sandbox Code Playgroud)


Jac*_*ord 6

用于reduce更简洁的代码,但您的方法是最清晰的:

const getDifference = (a, b) => Object.entries(a).reduce((ac, [k, v]) => b[k] && b[k] !== v ? (ac[k] = b[k], ac) : ac, {});
Run Code Online (Sandbox Code Playgroud)

如果我们使用的话,我们Object.entries会避免获取该值Object.keys- 它只是更容易。由于b[k]可能不存在,我们使用短路逻辑 AND运算符 - 因此,如果中&&存在键 from ,则不会将其添加到结果对象中。然后我们检查两个值是否相等 - 如果相等则不需要添加任何内容,但如果不相等我们将键和值添加到结果对象中。在这两种情况下,我们都返回结果对象。a bb