使用扩展语法时如何根据索引更新数组元素?

Ram*_*ddy 3 javascript arrays ecmascript-next

将数组视为

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.
Run Code Online (Sandbox Code Playgroud)

但是当我们使用扩展运算符来浅复制对象时,我们可以动态地覆盖一个属性,例如:

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

const newObject = { ...someObject, [propertyToChange]: 4 };
Run Code Online (Sandbox Code Playgroud)

那么,数组有等价的吗?也许类似于下面的内容来根据索引更改元素。

const newArray = [...oldArray, [dynamicIndex]: 4 ];
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 7

排序:您可以使用Object.assign

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

这是可行的,因为数组是对象。

实例:

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

  • @RameshReddy - 我不知道具体原因。这看起来对于解析器来说确实很尴尬。直到“:”它看起来像一个包含“dynamicIndex”的数组文字。我*认为*他们会尽量避免过多的前瞻...... (2认同)