Javascript 用另一个基于属性的对象数组替换对象数组

Javascript 用另一个基于属性的对象数组替换对象数组,javascript,ecmascript-6,Javascript,Ecmascript 6,如何用另一个基于属性的对象数组替换对象数组 var arr = [ {'status':'ok'}, {'status':'ok'}, {'status':'error'} ] var arr2 = [ {'status':error, 'msg': 'etc', 'more property':true} ] arr = arr.forEach((obj,i) => { if(obj.status === 'error'){obj = arr2[i]}

如何用另一个基于属性的对象数组替换对象数组

var arr = [
    {'status':'ok'},
    {'status':'ok'},
    {'status':'error'}
]

var arr2 = [
    {'status':error, 'msg': 'etc', 'more property':true}
]

arr = arr.forEach((obj,i) => { if(obj.status === 'error'){obj = arr2[i]} return obj })

我上面的代码失败了,状态ok消失了,我想知道出了什么问题。

您可以使用
数组#map()
创建一个新数组,并使用
数组#find()
在第二个数组中查找对象

让arr=[{status:“ok”},{status:“ok”},{status:“error”}],
arr2=[{状态:“错误”,消息:“etc”,“更多属性”:!0}];
arr=arr.map(a=>{
让fullObj=arr2.find(a2=>a2.status==a.status);
返回fullObj?fullObj:a;
});
控制台日志(arr)可用于将新特性指定给给定对象

var arr=[{status:'ok'},{status:'ok'},{status:'error'}],
arr2=[{status:'error',msg:'etc','more property':true}];
arr.forEach(对象=>{
如果(对象状态=='错误'){
Object.assign(obj,arr2[0]);
}
});
控制台日志(arr)
。作为控制台包装{最大高度:100%!重要;顶部:0;}
forEach()中的回调可以为索引获取额外的参数,但您忘记提供它。因此,如果您试图访问索引,您可以这样做

另外,您将arr赋值给forEach的输出,但是forEach()不返回任何内容,它只是对数组中的每个元素执行回调。您可以做的是将其替换为map,map类似,但实际上返回一个新数组

例:


我认为您要做的是将状态为“error”的对象替换为arr2对象[0],因此

for(obj in arr){
    arr[obj] = arr[obj]['status'] == 'error' ? arr2[0] : arr[obj];
}

期望的输出是什么?您能告诉我们期望的输出吗?
arr2[i]
i
未定义。而且,
arr[2]
也不存在。你能解释一下你想要实现什么吗?用arr2替换arr对象数组,基于status@AlanJenshen请仔细阅读我之前的评论。我怀疑丢失的
I
是打字错误。但是,
arr[2]
不可用,将使其不定义。如果[0]有限制,为什么不使用索引?如果我在arr和arr2中有2个错误状态,该怎么办?如果这是一个问题,分配也会起作用。是的,它可能会导致与ref赋值相关的问题,但它应该适用于1,就像OP的共享代码一样。@AlanJenshen,那么你需要一个条件,即你想要取哪个错误对象。@Rajesh,不,对
obj
的简单赋值不起作用,因为它是一个局部变量,赋值只会更改变量,但不是引用的对象。我向尼娜道歉!另外@AlanJenshen刚刚看到,
arr=arr.forEach
forEach
不会返回任何内容。您正在回调中返回,但不会返回此值。因此,
arr
变得
未定义
我发现我们的appraoch@AlanJenshen有问题,我看到了。请回答我的评论回答你的评论?
arr = arr.map((obj, i) => obj.status === 'error' ? arr2[i] : obj)
for(obj in arr){
    arr[obj] = arr[obj]['status'] == 'error' ? arr2[0] : arr[obj];
}