我有两个对象数组,它们之间的区别只在于arrayAfter会添加一个元素:
var arrayBefore = [
{"name":"Alan","height":"171","weight":"66"},
{"name":"Ben","height":"182","weight":"90"}
];
var arrayAfter= [
{"name":"Alan","height":"171","weight":"66"},
{"name":"Ben","height":"182","weight":"90"},
{"name":"Chris","height":"163","weight":"71"}
];
"名称"永远是独一无二的!
如何找出哪一个是已添加的元素?我尝试过最后使用嵌套for循环,但这似乎过于复杂。
我也发现了这个好主意:
var diff = $(arrayAfter).not(arrayBefore ).get();
但是,这似乎不能直接用于对象数组。
是否有一些简单的方法可以找到差异?
答案 0 :(得分:2)
答案 1 :(得分:1)
对于通用方法,您可以将Array.prototype.filter()
与Array.prototype.reduce()
结合使用,以迭代对象键:
arrayAfter.filter(function(after) {
return !arrayBefore.reduce(function(found, before) {
if (!found) {
found = true;
for (key in before) {
if (before.hasOwnProperty(key)) {
found = found && (before[key] === after[key]);
}
}
}
return found;
}, false);
}); //[{name: "Chris", height: "163", weight: "71"}]
答案 2 :(得分:0)
您可以使用Array.prototype.filter并过滤掉上一个数组中的这些元素。
var differences = arrayAfter.filter(function(el) {
return arrayBefore.indexOf(el) === -1;
});
答案 3 :(得分:0)
我相信jQuery没有什么可以直接解决你的问题。你的问题是比较对象是否相等。
我假设这个名字是唯一的。如果没有,对于此方法,您将需要一个唯一的数据标识符。如果您绝对没有,那么您可以连接所有数据以获得一个。
// first make a map of objects in before
var before = {};
arrayBefore.forEach(function(o){
before[o.name] = o;
});
// now we get the elements of after that do not exist in our hashmap
var result = arrayAfter.filter(function(o){
return !(o.name in before);
});
显然,您可以将其包含在一般功能中。