在两个JavaScript对象数组中查找值之间的差异

时间:2015-06-18 13:00:39

标签: javascript jquery arrays

我有两个包含对象的JavaScript数组,如下所示:

var array1 = [{'123': '18'}, {'578': '2'}, {'323': '5'}];
var array2 = [{'123': '18'}, {'578': '1'}, {'323': '3'}];

每个数组将具有与另一个数组相同的键(尽管可能不是以相同的顺序)。但是,对于给定的密钥,值可能不同。我想要的是array2中的对象数组,它们对array1中的相同键具有不同的值。所以,对于这个例子,我想:

[{'578': '1'}, {'323': '3'}]

我尝试了什么 我试图用jQuery的.inArray().grep()方法做到这一点,但这些方法正在把我的每一个对象交给我,而不仅仅是那些值有变化的对象:

difference = $.grep(array1,function(x) {
  return $.inArray(x, array2) < 0
})

Here is my fiddle. jQuery或常规JavaScript(甚至是Angular)解决方案会很棒。感谢。

7 个答案:

答案 0 :(得分:1)

试试这个:

var array1 = [{'578': '2'}, {'123': '18'}, {'323': '5'}];
var array2 = [{'123': '18'}, {'578': '1'}, {'323': '3'}];
var removed = [];
for(var k in array2){
    var found = k;
    for(var x in array2){
        if(JSON.stringify(array2[k]) ==  JSON.stringify(array1[x])){
            found = true;
            break;
        }
    }
    if(found !== true){
        removed.push(array2[found]);
    }
}

array2 = removed;
console.log(array2);

输出:

[Object { 578="1"}, Object { 323="3"}]

https://jsfiddle.net/or44aguz/1/

答案 1 :(得分:1)

首先,您需要将“键值”对象合并为一个,以便无论顺序如何,都可以直接查找键。

var argList = [{}].concat(array2);
// lookup will contain all key-value pairs in array2
var lookup = $.extend.apply($, argList);

然后,遍历array1并使用键在array2中查找相应的值并收集results数组中的差异:

var results = [];
$.each(array1, function(index, element) {
    for (var k in element) {
        if (element[k] != lookup[k])
            results.push({ k : lookup[k] });
    }
});

答案 2 :(得分:0)

为什么你的方法失败的原因是,javascript通过比较引用来比较数组和对象。 例如

var a = ['a','b','c'];
var b = ['a','b','c'];
a === b; // false

我建议你,检查这个答案:

答案 3 :(得分:0)

创建一个愚蠢的代码,但命令不重要。

&#13;
&#13;
var array1 = [{'123': '18'}, {'578': '2'}, {'323': '5'}];
var array2 = [{'123': '18'}, {'578': '1'}, {'323': '3'}];
var array3 = [{'578': '1'}, {'323': '3'}, {'123': '18'}];

function getDiff(array1, array2) {
    var map = {};
    var result = [];

    var l = array1.length;
    var i, obj, key;

    for (i = 0; i < l; ++i) {
        obj = array1[i];
        key = JSON.stringify(obj);
        map[key] = true;
    }
    
    var compare;
    for (i = 0; i < l; ++i) {
        obj = array2[i];
        key = JSON.stringify(obj);
        if (map[key] !== true) {
          result.push(obj);
        }
    }
    return result;
}

console.log(getDiff(array1, array2));
console.log(getDiff(array1, array3));
&#13;
&#13;
&#13;

答案 4 :(得分:0)

过滤器的一些乐趣:

var array1 = [{'123': '18'}, {'578': '2'}, {'323': '5'}];
var array2 = [{'123': '18'}, {'578': '1'}, {'323': '3'}];

difference = array1.filter(function(el, index) {
   return JSON.stringify(el) !== JSON.stringify(array2[index]);
});

console.log(difference);

这与循环一个数组并检查另一个数组真的相同,但你不会有索引等等,只是更紧凑。

只是旁注:您不能直接比较对象,因为===运算符检查它们是否产生相同的内存位置,因此最干净和最快速的解决方案是将它们转换为字符串(使用JSON.stringify)和检查他们是否真的是同一件事。

小提琴http://jsfiddle.net/pac2ps9t/1/

答案 5 :(得分:0)

即使订单已更改,以下代码段仍可正常运行。

var array1 = [{'123': '18'}, {'578': '2'}, {'323': '5'}];
var array2 = [{'123': '18'}, {'578': '1'}, {'323': '3'}];
var res=[];
for(var i=0;i<array2.length;i++){
var jsonObj=array2[i];
var j=0; var key;

for(var k in jsonObj){
if(j==0){
key=k;
j++;
}
}

var value=array2[i][key];
var flag=0;
for(var i2=0;i2<array1.length;i2++){
if(array1[i2][key]==value) flag=1;
}
if(flag==0)res.push(array2[i])

}
console.log(res);

最后打印res。

答案 6 :(得分:0)

使用java-script JSBIN

var array1 = [ {'578': '2'}, {'323': '5'},{'123': '18'}];
var array2 = [{'123': '18'}, {'578': '1'}, {'323': '3'}];
var result = [];
for(var k in array2){
  var key = Object.keys(array2[k]).join();

  for(var l in array1){
  if(array1[l][key]){
    if(array1[l][key] != array2[k][key]){
     result.push(array2[k]);
    }
   }
  }
}
console.log(JSON.stringify(result));
//"[{\"578\":\"1\"},{\"323\":\"3\"}]"
相关问题