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

qltillow  于 2022-12-21  发布在  Java
关注(0)|答案(3)|浏览(177)

我试图找出什么是最好的方法来获得两个对象之间的交叉对象使用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()迭代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;
}

我知道loadash/underline有这些类型的帮助函数......但是尝试看看es6是否有任何新的简短语法,如果没有,使用vanilla js做这件事的最短方法是什么。

x33g5p2x

x33g5p2x1#

使用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中,它就不会被添加到结果对象中,然后我们检查两个值是否相等--如果它们 * 相等 *,那么不需要添加任何内容,但是如果它们不是 not,我们将b中的键和值添加到result对象中,在这两种情况下,我们都返回result对象。

lh80um4z

lh80um4z2#

你可以使用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'}
mkshixfv

mkshixfv3#

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

相关问题