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

getting difference object from two objects using es6

我正在尝试找出使用 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'}

是否有使用 es6 执行此操作的捷径,或者我是否需要使用 for(in) 和 Object.keys() 遍历对象并进行比较,将交点分配给 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;
}

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

您可以使用Object.entries()获取对象b的条目,然后使用.filter()过滤掉与a相同的键值对,然后,您可以像这样使用 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'}

如果您不支持 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'}

使用 reduce 以获得更简洁的代码,但您的方法是最清晰的:

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

我们使用 Object.entries 以避免在使用 Object.keys 时获取值 - 它更容易。由于 b[k] 可能不存在,我们使用短路逻辑 AND && 运算符 - 所以如果来自 a 的键不存在 b,它没有添加到结果对象中。然后我们检查这两个值是否相等 - 如果它们 ,则不需要添加任何内容,但如果它们 不是 ,我们添加从 b 到结果对象的键和值。在这两种情况下,我们 return 结果对象。

您可以通过 Object.keys();

在单个短片中实现此目的

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

const findVariantsElement = (main, compareWith) => {
  const result = {};
  Object.keys(main).forEach((r) => {
    const element = main[r];
    if (compareWith[r]) {
      if (element !== compareWith[r]) {
        result[r] = compareWith[r];
      }
    }
  });
  return result;
};

const c = findVariantsElement(mainObj, comapareObj);
console.log(c); 

您也可以使用 .map() 同样的方法

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

const findVariantsElement = (main, compareWith) => {
  const result = {};
  Object.keys(main).map((r) => {
    const element = main[r];
    if (compareWith[r]) {
      if (element !== compareWith[r]) {
        result[r] = compareWith[r];
      }
    }
  });
  return result;
};

const c = findVariantsElement(mainObj, comapareObj);
console.log(c);