使用扩展运算符克隆数组并添加内联

时间:2017-06-12 17:21:23

标签: javascript ecmascript-next

有了一个物体,我可以克隆&添加如下:

   let newObject = {
      ...obj,
      [key]: { 
         ...obj[key],
         thing: true }
   }

因此,这会向数组添加一些对象,然后更新一个对象的属性。 我知道要更新的项目索引,但不想覆盖现有属性。

现在我想对数组做同样的事情:

   let newArray = [
     ...arr,
     [key]: { 
         ...arr[key],
         thing: true }
   ]

可能与上述相同。

但这不起作用。

{key}:thing应该有效吗?我记得在某个地方读过这篇文章,也许是ES7?

我能做到:

   let newArray = arr.map((item, key) => key === index ? { ...item, thing: true } : item);

但我希望语法更清晰。如果没有类似的语法,我会接受否。

2 个答案:

答案 0 :(得分:1)

您可以使用Object.assign()

const arr = [{ a: 1 }, { b: 1 }, { c: 1 }];
const index = 1;

const newArr = Object.assign([], arr, { [index]: { ...arr[index], thing: true } });
console.log(newArr);

答案 1 :(得分:0)

阵列没有密钥,因此您使用的语法不起作用。它是一个对象数组吗?如果是的话......

编辑 - 根据您的评论,试试这个:

// if you know the index of the object you'd like to modify
let newArray = [
     ...arr
]
newArray[idx][key] = thing

// if you don't know the index
let newArray = [
     ...arr
]
newArray.map((el) => {
    if (/* YOUR LOGIC HERE TO DETERMINE IF THIS IS THE OBJECT TO MODIFY! */) {
        return el[key] = thing
    } else {
        return el
    }
})

// if you want it done in one function...
let newArray = []
arr.map((el) => {
    if (el[key]) {
        newArray.push(Object.assign({}, { [key]: thing }))
        return el
    } else {
        newArray.push(Object.assign({}, el))
        return el
    }
})