我有两个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
}
}
}
我正在处理的真实数据是任意深度的嵌套(通常在对象中包含数十个对象),但是我希望以上示例对您有所帮助。
这是一项一次性的任务,因此我并不特别关注性能,只要可以使用任何库,我很乐意使用。感谢您的帮助!
答案 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