Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找两个JavaScript对象数组中的值之间的差异_Javascript_Jquery_Arrays - Fatal编程技术网

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

查找两个JavaScript对象数组中的值之间的差异,javascript,jquery,arrays,Javascript,Jquery,Arrays,我有两个包含对象的JavaScript数组,如下所示: var array1 = [{'123': '18'}, {'578': '2'}, {'323': '5'}]; var array2 = [{'123': '18'}, {'578': '1'}, {'323': '3'}]; 每个数组将具有与另一个相同的键(尽管顺序可能不同)。但是,给定键的值可能不同。我想要的是array2中的对象数组,这些对象在array1中的同一个键具有不同的值。因此,对于这个例子,我想: [{'578': '

我有两个包含对象的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
})
difference=$.grep(数组1,函数(x){
返回$.inArray(x,array2)<0
})

jQuery或常规JavaScript(甚至Angular)解决方案将非常好。谢谢。

方法失败的原因是javascript通过比较引用来比较数组和对象。 比如说

var a = ['a','b','c'];
var b = ['a','b','c'];
a === b; // false
我建议您检查以下答案:

试试这个:

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"}]

创建一个愚蠢的代码,但顺序并不重要

var array1=[{'123':'18'},{'578':'2'},{'323':'5'}];
var array2=[{'123':'18'},{'578':'1'},{'323':'3'}];
var array3=[{'578':'1'},{'323':'3'},{'123':'18'}];
函数getDiff(array1,array2){
var-map={};
var结果=[];
var l=阵列1.长度;
变量i,obj,键;
对于(i=0;ilog(getDiff(array1,array3))只是一些有趣的过滤器:

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)并检查它们是否真的是相同的东西


fiddle

首先,您需要将“key-value”对象合并为一个对象,以支持直接查找键,而不考虑顺序

var argList = [{}].concat(array2);
// lookup will contain all key-value pairs in array2
var lookup = $.extend.apply($, argList);
然后,遍历array1并使用键查找array2中的相应值,并收集
结果中的差异
数组:

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

即使顺序更改,以下代码段也可以工作

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);
var array1=[{'123':'18'},{'578':'2'},{'323':'5'}];
var array2=[{'123':'18'},{'578':'1'},{'323':'3'}];
var-res=[];
对于(var i=0;i使用java脚本


数组中的每个对象都只有一个键吗?@fuyushimoya是的,只有一个键。“虽然顺序可能不一样”,正如你接受的答案,我认为这没那么重要?很好!JSON.stringify()的使用很好为了避开@Roland Szabo指出的问题。谢谢!如果两个数组中的键顺序不一样,这将中断。谢谢@Amine。我更新了原始问题中的小提琴,以反映键的不同顺序。
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\"}]"