【问题标题】:How to update an element of an array based on the index when using spread syntax? [duplicate]使用扩展运算符时如何更新数组内的元素[重复]
【发布时间】:2020-07-14 19:09:45
【问题描述】:

将数组视为

const foo = [1, 2, 3];

现在,如果我想替换第二个元素,我可以这样做:

foo[1] = 4;

foo.splice(1,1,4);

const foo = [1, 2, 3];

console.log([...foo.slice(0, 1), 4, ...foo.slice(2)]);
// I know this creates a new array unlike the above two ways.

但是当我们使用扩展运算符进行浅拷贝对象时,我们可以动态覆盖如下属性:

const someObject = {
 a: 1,
 b: 2,
 c: 3
}
const propertyToChange = 'b';

const newObject = { ...someObject, [propertyToChange]: 4 };

那么,数组是否有这样的等价物?也许像下面这样根据索引更改元素。

const newArray = [...oldArray, [dynamicIndex]: 4 ];

【问题讨论】:

    标签: javascript arrays ecmascript-next


    【解决方案1】:

    排序:你可以使用Object.assign

    const newArray = Object.assign([...oldArray], {[dynamicIndex]: 4});
    // Or
    const newArray = Object.assign([], oldArray, {[dynamicIndex]: 4});
    

    这很有效,因为数组是对象。

    现场示例:

    const oldArray = [1, 2, 3, 4, 5, 6];
    const dynamicIndex = 3; // The fourth entry
    const newArray = Object.assign([], oldArray, {[dynamicIndex]: "four"});
    console.log(newArray);

    【讨论】:

    • 不错。我假设像const newArray = [...oldArray, [dynamicIndex]: 4 ]; 这样的一些没有实现,因为它与对象的语法有冲突。会不会是这个原因?
    • @RameshReddy - 我不知道具体原因。对于解析器来说,这看起来确实很尴尬。在: 之前,它看起来像一个包含dynamicIndex 的数组文字。我认为他们尽可能避免过多的前瞻......
    • (我很失望地看到我在 6 月/7 月出版的书的第 5 章中没有包含上述技巧[如果您有兴趣,请参阅我的个人资料]... :- | 啊,嗯,总有网站,也许还有第二版……)
    • @T.J.Crowder,现有技术:stackoverflow.com/questions/51188539/…
    • @NinaScholz - 我确实想知道这是否在某个地方被覆盖,看起来不够清楚。我已经标记了骗子。由于已被接受,因此无法删除,但是...
    猜你喜欢
    • 2021-08-08
    • 2020-04-27
    • 2016-06-12
    • 2022-06-28
    • 1970-01-01
    • 2017-11-15
    • 2020-04-13
    • 2019-02-21
    相关资源
    最近更新 更多