在一行代码中用扩展语法替换数组条目?

Kok*_*oko 10 javascript reactjs spread-syntax

我正在使用... spread语法替换react状态数组中的项.这有效:

let newImages = [...this.state.images]
newImages[4] = updatedImage
this.setState({images:newImages})
Run Code Online (Sandbox Code Playgroud)

是否可以在一行代码中执行此操作?像这样的东西?(这显然不起作用......)

this.setState({images: [...this.state.images, [4]:updatedImage})
Run Code Online (Sandbox Code Playgroud)

Ami*_*ash 20

使用Array.slice

this.setState({images: [...this.state.images.slice(0, 3), updatedImage, ...this.state.images.slice(4)]})
Run Code Online (Sandbox Code Playgroud)

  • 当索引未知时,您将如何执行此操作?如果 n=0,你会得到 n-1 的 slice(0, -1)。有没有优雅的方法? (4认同)
  • 如果想替换索引4处的项目,这个答案是不正确的,请参阅我的答案以获得进一步的解释。 (2认同)

T.J*_*der 12

没有提供的语法,没有.Object.assign做的工作:

this.setState({images: Object.assign([...this.state.images], {4: updatedImage}));
Run Code Online (Sandbox Code Playgroud)

...但涉及一个临时对象(最后一个).不过,只是一个临时对象......

它的工作原理是因为普通的JS数组不是真正的数组1,它们是具有一些特殊功能的对象.他们的"索引"实际上是符合某些标准的财产名称2.所以,我们正在扩展this.state.images到一个新的数组,将其传递Object.assign给目标,并给Object.assign一个具有一个名为的属性的对象"4"(是的,它最终是一个字符串,但我们可以把它写成一个数字)我们想要更新的值.

实例:

const a = [0, 1, 2, 3, 4, 5, 6, 7];
const b = Object.assign([...a], {4: "four"});
console.log(b);
Run Code Online (Sandbox Code Playgroud)

如果4可以变量,那很好,您可以使用计算属性名称(ES2015中的新增内容):

let n = 4;
this.setState({images: Object.assign([...this.state.images], {[n]: updatedImage}));
Run Code Online (Sandbox Code Playgroud)

注意[]周围n.


1披露:这是我贫穷的小博客上的帖子.

2这是项目符号列表后面的第二段:

一个整数指数是一个字符串值属性密钥是一个规范的数字串(见7.1.16),并且其数字值是0或正整数2≤ 53 -1.一个数组索引是一个整数指数,其数值的范围是从0≤ <2 32 -1.

Object.assign与create-the-array-then-update-index-4的功能相同.

  • @Kokodoko:但比传播两个临时数组更有效率.:-) (2认同)

CD.*_*D.. 8

你可以使用map:

const newImages = this.state.images
  .map((image, index) => index === 4 ? updatedImage : image)
Run Code Online (Sandbox Code Playgroud)


fur*_*ceX 7

您可以将数组转换为对象 (the ...array1),替换项目 (the [1]:"seven"),然后将其转换回数组 ( Object.values) :

array1 = ["one", "two", "three"];
array2 = Object.values({...array1, [1]:"seven"});
console.log(array1);
console.log(array2);
Run Code Online (Sandbox Code Playgroud)