gpt4 book ai didi

javascript - 如何知道一个对象是否包含另一个对象

转载 作者:行者123 更新时间:2023-11-30 00:29:12 25 4
gpt4 key购买 nike

我正试图找到一个库能够判断对象 B 是否包含对象 A 的所有属性和值(而不是相反!)。

这意味着我发现的图书馆无法处理的两件事:

  1. 对象 B 可以比对象 A 拥有更多的键,并且它可以是是的。
  2. 对象 B 的数组中的项目可能多于对象A,这可能是真的。

这基本上就是 lodash 的方法 _.difference() 所做的,但仅适用于数组中的项目。

我发现了一些有趣的库,比如 deep-diff , 但任何我需要的东西。

我可以编写一些代码来完成这项工作,但我相信其他人以前也满足过这种需求。

这是一个包含 2 个对象的示例:

var A = {
name: 'toto',
pets: [ { name: 'woof', kind: 'dog' } ]
};

var B = {
name: 'toto',
pets: [ { name: 'gulp', kind: 'fish' }, { name: 'woof', kind: 'dog' } ],
favoriteColor: 'blue'
};

这里,A 包含 B,因为我们可以在 B 中找到 A 的所有属性和值。但是像 diff 这样的库会拒绝,因为这不是等于 A 的“pets”的第一项而是第二项,并且 B 有一个附加属性“favoriteColor”。

您知道可以进行这种比较的图书馆吗?

最佳答案

您可以使用评论中链接的 deepCompare 的修改版本。看起来,您真的只需要通过 key 长度比较。

// where b has all of a
function deepHas(a, b) {
if (typeof a !== typeof b) {
return false;
}
if (typeof a !== 'object') {
return a === b;
}

// you may need to polyfill array higher-order functions here
if(Array.isArray(a) && Array.isArray(b)) {
return a.every(function(av) {
return b.indexOf(av) !== -1;
});
}

if (Object.keys(a).length > Object.keys(b).length) {
return false;
}
for (var k in a) {
if (!(k in b)) {
return false;
}
if (!deepHas(a[k], b[k])) {
return false;
}
}
return true;
}


var a1 = {
foo: ['a', 'b', 'c'],
bar: 'bar',
baz: {
baz: {
baz: 'wee'
}
}
};

var b1 = {
foo: ['a', 'b', 'c', 'd'],
bar: 'bar',
baz: {
baz: {
baz: 'wee',
whatever: 'wat'
}
},
ok: 'test'
};

console.log('b1 has all of a1', deepHas(a1, b1));

var a2 = {
foo: ['a', 'b', 'c'],
bar: 'bar',
baz: {
baz: {
baz: 'wee'
}
}
};

var b2 = {
foo: ['a', 'b', 'c'],
baz: {
baz: {
baz: 'wee'
}
}
};

console.log('b2 does not have all of a2', !deepHas(a2, b2));

console.log('["a","b"] has ["b"]', deepHas(["b"], ["a","b"]));

console.log('{foo: ["a","b"]} has {foo: ["b"]}', deepHas({ foo: ["b"] }, { foo:["a","b"] }));

关于javascript - 如何知道一个对象是否包含另一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30246439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com