获取两个对象数组之间的差异

时间:2015-09-03 14:52:13

标签: javascript jquery

我有两个对象数组,它们之间的区别只在于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();

但是,这似乎不能直接用于对象数组。

是否有一些简单的方法可以找到差异?

4 个答案:

答案 0 :(得分:2)

如果只有名称表示唯一性,您可以这样做:

index

演示:http://jsfiddle.net/tehgc8L5/

答案 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);
});

显然,您可以将其包含在一般功能中。