我想比较两个数组obj 用于过滤器 如何使用与另一个数组obj的对象严格不同的对象过滤数组?
var y = [
{ nb :'rouge',
xb :'rouge',
x : 12 },
{ nb :'red',
xb :'rouge',
x : 12 }
]
,
var x = [
{ nb :'rouge',
xb : 'rouge',
x : 12,
},
{ nb :'red',
xb : 'rouge',
x : 12,
},
{ nb :'violet',
xb : 'violet',
x : 12,
},
]
const dispo = x.filter( x !== y );
console.log(dispo)
预期结果:
[{nb:紫罗兰色, xb:“紫色”, x:12}
]
答案 0 :(得分:1)
您将需要按值比较对象。您可以使用lodash的_.isEqual或_.isEqualDeep之类的东西。没有lodash的简单方法是这样的:
function compare(a, b)
{
if (Object.keys(a).length !== Object.keys(b).length) {
return false;
}
for (let p of Object.keys(a)) {
if (!b.hasOwnProperty(p)) {
return false;
}
if (a[p] !== b[p]) {
return false
}
}
return true;
}
function includesObj(array, obj)
{
for (let el of array) {
if (compare(obj, el)) {
return true;
}
}
return false;
}
console.log(x.filter(el => !includesObj(y, el)));
这不会做深入的比较。仅当您的对象的值是基元(而不是数组,函数,其他对象)时才起作用。但您的情况也可以。
答案 1 :(得分:0)
您不能简单地在javascript中比较两个对象,因为会比较引用而不是此对象的值。
您可以检查此链接以了解以下信息:
https://medium.com/javascript-in-plain-english/comparing-objects-in-javascript-ce2dc1f3de7f
如果您更喜欢简单而不是复杂,并且放入数组中的对象并不复杂,则可以尝试Json.stringify(),它会将您的对象转换为字符串,从而易于比较。
请注意,在下一个示例中,我更改了数组的顺序和可读性的名称。
var firstArray = [
{
nb: 'rouge',
xb: 'rouge',
x: 12,
},
{
nb: 'red',
xb: 'rouge',
x: 12,
},
{
nb: 'violet',
xb: 'violet',
x: 12,
},
];
var secondArray = [
{
nb: 'rouge',
xb: 'rouge',
x: 12
},
{
nb: 'red',
xb: 'rouge',
x: 12
}
];
function difference(firstArray, secondArray) {
return firstArray.filter(firstArrayElement => {
return !isContainedInSecondArray(firstArrayElement, secondArray);
});
}
function isContainedInSecondArray(firstArrayElement, secondArray) {
return secondArray.find(secondArrayElement => {
if (JSON.stringify(firstArrayElement) == JSON.stringify(secondArrayElement)) {
return true;
}
});
}
//prints [ { nb: 'violet', xb: 'violet', x: 12 } ]
console.log(difference(firstArray, secondArray));
//prints []
console.log(difference(secondArray, firstArray));