比较两个对象数组以通过键 number
查找不同的值假设旧对象由
组成oldChoices = [{"number": 1, "text": "abc" }, {"number": 2, "text": "pqr" }]
新对象由
组成newChoices = [{"number": 1, "text": "abc" }, {"number": 2, "text": "pqr" }, {"number": 3, "text": "xyz" }]
因此需要获得:
[{"number": 3, "text": "xyz" }]
注意: 1。在文本框的keypress事件中,值填充在newChoices数组中。 2. newChoices也可以在一开始就获得价值。
尝试1:
var uniqueTemp = [];
$.each(oldChoices, function(x, e1){
$.each(newChoices, function(y, e2){
if(e1.number != e2.number){
uniqueTemp.push(e2);
}
});
})
尝试2:
var uniqueTemp = [];
oldChoices.filter(function(x){
if(newChoices.indexOf(x.number) === -1){
uniqueTemp.push(x);
return true;
}else{
return false;
}
});
预期:
[{"number": 3, "text": "xyz" }]
答案 0 :(得分:2)
您的第二次尝试即将结束,只需更改为:
newChoices.filter((x) => {
return (!oldChoices.find((choice) => choice.number === x.number));
});
答案 1 :(得分:2)
您可以使用Set
并过滤新数组。
var oldChoices = [{ number: 1, text: "abc" }, { number: 2, text: "pqr" }],
newChoices = [{ number: 1, text: "abc" }, { number: 2, text: "pqr" }, { number: 3, text: "xyz" }],
old = new Set(oldChoices.map(({ number }) => number)),
result = newChoices.filter(({ number }) => !old.has(number));
console.log(result);
答案 2 :(得分:1)
这是您的解决方案。只需使用flag
就可以了。
在arr
中,您将有一个unique object
符合预期。
var oldChoices = [{"number": 1, "text": "abc" }, {"number": 2, "text": "pqr" }]
var newChoices = [{"number": 1, "text": "abc" }, {"number": 2, "text": "pqr" }, {"number": 3, "text": "xyz" }];
var arr = []
var flag = 0;
newChoices.forEach(function(newChoice){
oldChoices.forEach(function(oldChoice){
if(oldChoice.number == newChoice.number){
flag = 1;
}
});
if(flag != 1){
arr.push(newChoice);
}
flag = 0;
});
console.log(arr);
答案 3 :(得分:0)
这是一个通用函数,用于计算两个数组的差:
let arrayDifference = (v1, v2, cmp = null) =>
[...v1.filter(o1 => !v2.some(o2 => cmp ? cmp(o1, o2) : o1 === o2)),
...v2.filter(o1 => !v1.some(o2 => cmp ? cmp(o1, o2) : o1 === o2))]
比起您可以使用正确的比较功能调用它:
arrayDifference(
oldChoices,
newChoices,
(o1, o2) => o1.number === o2.number
)
此函数查找在oldChoices和newChoices中都出现的唯一对象。