如何检查数组是否包含对象

时间:2018-03-06 15:06:15

标签: javascript

我有从json创建的数组:

var array = [{"name":"name1","group":"group1","id":"123", ...},
{"name":"name2","group":"group2","id":"456", ...},
{"name":"name3","group":"group1","id":"789", ...}];

我得到另一个阵列后:

var array1 = [{"name":"name1","group":"group1","id":"123", ...},
{"name":"name4","group":"group1","id":"987", ...}]

我需要将第二个数组中的项目推送到第一个,但是如何检查第一个数组是否包含来自第二个数组的对象?

数组中的每个对象都包含更多属性,其中一些是动态创建的,因此我无法通过indexOf()检查。我发现的所有解决方案仅适用于Int之类的简单对象。如果我可以通过属性“id”进行检查,那就太棒了。

2 个答案:

答案 0 :(得分:2)

先使用find

var newObj = {"name":"name2","group":"group2","id":"456"};
var value = array.find( s => s.id == newObj.id );  

现在推送value未找到

if ( !value )
{
   array.push( newObj ) 
}

答案 1 :(得分:0)

(更通用)你可以使用以下方法执行这一行(这将添加不在数组中的所有对象)。

array.concat(array1.filter(x=>!array.find(s=>s.id==x.id)));

var array = [{"name":"name1","group":"group1","id":"123"},
             {"name":"name2","group":"group2","id":"456" },
             {"name":"name3","group":"group1","id":"789"}];

var array1 = [{"name":"name1","group":"group1","id":"123"},
              {"name":"name4","group":"group1","id":"987"}];

array=array.concat(array1.filter(x=>!array.find(s=>s.id==x.id)));
console.log(array);