JavaScript中两个深层对象的交集

时间:2018-08-28 17:00:40

标签: javascript object nested javascript-objects

我有两个JavaScript对象(任意深度),它们具有很多相同的信息。

我正在寻求帮助获取两个对象之间的共享数据

例如:

const a = {
  name: 'Alice',
  features: {
    speed: 3,
    strength: 90,
    mind: {
      power: 42
    }
  }
};

const b = {
  name: 'Bob',
  features: {
    speed: 3,
    stamina: 1,
    mind: {
      power: 42,
      flexibility: 0,
      telekinesis: 42
    }
  }
};

我的目标是想出一种解决方案,以产生他们共享的数据:

const shared = {
  features: {
    speed: 3,
    mind: {
      power: 42
    }
  }
}

我正在处理的真实数据是任意深度的嵌套(通常在对象中包含数十个对象),但是我希望以上示例对您有所帮助。

这是一项一次性的任务,因此我并不特别关注性能,只要可以使用任何库,我很乐意使用。感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

您可以使用递归方法,通过检查两个对象中是否存在属性,真实属性以及相同的对象类型或相同的值。

使用变量temp可以防止空的嵌套对象。

function common(object1, object2) {
    return Object.assign(...Object.keys(object1).map(k => {
        var temp;
        if (!(k in object2)) {
            return {};
        }
        if (object1[k] && typeof object1[k] === 'object' &&
            object2[k] && typeof object2[k] === 'object') {
            temp = common(object1[k], object2[k]);
            return Object.keys(temp).length ? { [k]: temp } : {};
        }
        if (object1[k] === object2[k]) {
           return { [k]: object1[k] };
        }
        return {};
    }));
}

const
    a = { name: 'Alice', features: { speed: 3, strength: 90, mind: { power: 42 } } };
    b = { name: 'Bob', features: { speed: 3, stamina: 1, mind: { power: 42, flexibility: 0, telekinesis: 42 } } };

console.log(common(a, b));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

您可以使用for...in迭代来遍历对象并检查其属性。 请在下面的代码中查看您是否想要的。

const a = {
  name: 'Alice',
  features: {
    speed: 3,
    strength: 90,
    mind: {
      power: 42
    }
  }
};

const b = {
  name: 'Bob',
  features: {
    speed: 3,
    stamina: 1,
    mind: {
      power: 42,
      flexibility: 0,
      telekinesis: 42
    }
  }
};

function equalProps(a,b){
  var newObj = {}; 
  for (var key in a){
    if (typeof a[key] === 'object'){
      var obj = equalProps(a[key], b[key]);
      newObj[key] = obj;
    }else if (a[key] == b[key]){
      newObj[key] = a[key];
    }
  }
  return newObj;
}

console.log(equalProps(a,b))

答案 2 :(得分:0)

当对象值为FeedOptions时,该线程中的其他答案似乎崩溃了,所以我结合了每个答案的最佳部分以提出一个可靠的解决方案:

undefined