【问题标题】:replace array of object with another array of object base on property根据属性用另一个对象数组替换对象数组
【发布时间】:2017-06-13 08:01:28
【问题描述】:

如何根据属性用另一个对象数组替换对象数组?

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没了,不知道是什么问题。

【问题讨论】:

  • 想要的输出是什么?
  • 你能告诉我们预期的输出吗?
  • arr2[i] i 未定义。此外,arr[2] 也不存在。你能解释一下你想要达到的目标吗?
  • 根据状态将arr的对象数组替换为arr2
  • @AlanJenshen 请正确阅读我之前的评论。我怀疑缺少i 是一个错字。但arr[2] 不可用,将使其未定义

标签: javascript ecmascript-6


【解决方案1】:

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

let arr=[{status:"ok"},{status:"ok"},{status:"error"}],
arr2=[{status:"error",msg:"etc","more property":!0}];

arr = arr.map(a=>{
  let fullObj = arr2.find(a2=>a2.status===a.status);
  return fullObj ? fullObj : a;
});

console.log(arr);

【讨论】:

【解决方案2】:

您可以使用Object.assign 为给定对象分配新属性。

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

arr.forEach(obj => {
    if (obj.status === 'error') {
        Object.assign(obj, arr2[0]);
    }
});

console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • arr[0] 有限制,为什么不用索引呢?如果我在 arr 和 arr2 中有 2 个错误状态怎么办?
  • 如果这是问题,分配也将起作用。是的,它可能会导致与 ref 分配相关的问题,但它应该像 OP 的共享代码一样适用于 1。
  • @AlanJenshen,那么你需要一个条件,即你想要获取哪个错误对象。
  • @Rajesh,没有对obj 的简单赋值是行不通的,因为它是一个局部变量,赋值只会改变变量,而不是引用的对象。
  • 我很抱歉尼娜! @AlanJenshen 也刚刚看到,arr = arr.forEachforEach 不会返回任何东西。您正在回调中返回,但不会返回此值。所以arr变成undefined
【解决方案3】:
var arr = [
{'status':'ok'},
{'status':'ok'},
{'status':'error'}
]

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

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

forEach() 中的回调可以为索引附加一个 arg,但您忘记提供它。因此,如果您尝试访问索引,则可以这样做。

此外,您将 arr 分配给 forEach 的输出,但 forEach() 不返回任何内容,它只是为数组中的每个元素执行回调。你可以做的是把它换成map,这很相似,但实际上返回了一个新数组。

例如:

arr = arr.map((obj, i) => obj.status === 'error' ? arr2[i] : obj)

【讨论】:

    【解决方案4】:

    我认为您要做的是将状态为“错误”的那个替换为 arr2 对象 [0] 所以..

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 2021-10-24
      相关资源
      最近更新 更多