我有两个对象列表,主要包含不同的属性。但是,它们之间的一个属性是相似的。我使用它来验证一个列表不包含具有在另一个列表中找到的对象中存在的属性的对象。
假设childrenA
是包含属性name
,age
,weight
的对象列表,childrenB
是包含属性{{1}的对象列表},name
,eyeColor
。
要过滤hairColor
,使其不包含与childrenA
中名称相同的对象,我会这样做:
childrenB
然而,孩子仍然分享孩子B的名字。在这种情况下使用filter / some是不正确的?
答案 0 :(得分:2)
是的,因为.some
如果任何元素的回调都为真,它将返回true,仅仅childrenB
的一个成员没有相同的名称就足够了(这不是不是你想要的。
请考虑使用相关的.every
方法:
(简单来说,这会检查 childrenB
的每个成员的名称与childA
不同):
childrenA = childrenA.filter(function(childA) {
return childrenB.every(function(childB) {
return childA.name !== childB.name;
});
});
或者,您可以否定.some
的返回并检查名称相等性:
(同样,在英语中,这会检查不是childrenB
的某些成员,其名称与childA
相同。您应该能够看到这是怎么回事只是上面相同检查的另一种形式)
childrenA = childrenA.filter(function(childA) {
return !childrenB.some(function(childB) { // <-- note the negation
return childA.name === childB.name; // <-- note the ===
});
});