Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.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/JS将数组对象搜索为数组对象_Javascript_Angularjs - Fatal编程技术网

Javascript/JS将数组对象搜索为数组对象

Javascript/JS将数组对象搜索为数组对象,javascript,angularjs,Javascript,Angularjs,我的问题是: 我有两个这样的数组对象 var array1 = [{ "id": 1, "name": "potatoe", photo="photo"}, {"id": 2, "name": "budget"}] var array2 = [{ "id": 1, "name": "potatoeModified"},{ "id": 3, "name": "UhOhAnotherName"}, {"id": 2, "name": "budget"}] 我想搜索array1 ID对象是否

我的问题是:

我有两个这样的数组对象

var array1 = [{ "id": 1, "name": "potatoe", photo="photo"}, {"id": 2, "name": "budget"}]

var array2 =  [{ "id": 1, "name": "potatoeModified"},{ "id": 3, "name": 
 "UhOhAnotherName"}, {"id": 2, "name": "budget"}]
我想搜索array1 ID对象是否在数组2中,如果是ID 1=1,则将替换名称,如果不存在,则将添加ID 3

结果将是

[{ "id": 1, "name": "potatoeModified", photo="photo"}, {"id": 2, "name": "budget"},
{ "id": 3, "name": "UhOhAnotherName"}]
我试着这么做,但我总是得到一个圈复杂度太高的函数,我不想要一个超大的函数。我认为解决办法很简单,但我太盲目了。。。。。
谢谢:)

我将从每个数组中创建一个临时对象,该数组使用id作为键,并将每个项存储为值

然后,您可以循环遍历数组2临时对象,根据临时对象1中是否存在id键,调整名称或推送到数组1

var array1=[{“id”:1,“name”:“potatoe”,photo:“photo”},{“id”:2,“name”:“budget”}];
var array2=[{“id”:1,“name”:“potatoeModified”},{“id”:3,“name”:
“UhOhAnotherName”},{“id”:2,“name”:“budget”}];
//使用下面的辅助函数创建临时对象
var tmp_1=toObj(阵列1),
tmp_2=toObj(array2);
//遍历数组2临时对象,调整名称或推送到数组1
Object.keys(tmp_2).forEach((key)=>{
如果(tmp_1[键]){
//如果数组1中存在相同的id,请设置名称
tmp_1[key].name=tmp_2[key].name;
}否则{
//当不存在相同id时,推送到数组1
阵列1.推送(tmp_2[键]);
}
});
控制台日志(array1);
//防止代码重复的助手函数
函数toObj(arr){
返回arr.reduce((a,c)=>{
a[c.id]=c;
返回a;
},{})
}
尝试以下操作:

var array1=[{“id”:1,“name”:“potatoe”,“photo”:“photo”},{“id”:2,“name”:“budget”}];
var array2=[{“id”:1,“name”:“potatoeModified”},{“id”:3,“name”:
“UhOhAnotherName”},{“id”:2,“name”:“budget”}];
数组1.映射(函数(val,i){
数组2.forEach(函数(v){
如果(val.id==v.id){
val.name=v.name;
}
否则{
var found=array1.some(函数(el){
返回el.id==v.id;
});
如果(!found){array1.push(v);}
}
})
返回val;
});

控制台日志(array1)
temp=v只起作用,因为示例中缺少一个……如果有多个,它只会推最后一个缺少的,而不会推其他的。@charlietfl,如果答案有帮助,我至少应该得到你的投票。老实说,这不是一个非常有效的方法,因为你必须做这么多循环。@charlietfl,我知道,但这里的需求迫使你这么做。不,如果你在一次迭代中映射到对象并进行对象查找,你就不会这么做。迭代次数大大减少了很多,比我得到的要干净得多:)我还意识到数组2甚至不需要对象。。。只是第一个…然后在数组2上循环并执行类似操作。我做这件事的方式仍然简短易读。习惯于创建这样的对象进行查找…非常方便