- 此问题在此处已有答案**:
(9个答案)
上个月关门了。
我使用... spread语法替换react state数组中的一个元素。
let newImages = [...this.state.images]
newImages[4] = updatedImage
this.setState({images:newImages})
有没有可能在一行代码中完成这件事?类似于这样?(这显然行不通......)
this.setState({images: [...this.state.images, [4]:updatedImage})
8条答案
按热度按时间4ioopgfo1#
使用Array.slice
从原始帖子编辑:更改了slice方法的第二个参数中的3 o a 4,因为第二个参数指向的数组成员超出了保留的最后一个成员,所以它现在正确地回答了原始问题。
svmlkihl2#
一旦change array by copy提案得到广泛支持(它处于第3阶段,因此应该会进入JavaScript引擎),您就可以使用新的
with
方法来实现这一点:在此之前,
Object.assign
将执行以下任务:...但是涉及到一个临时对象(末尾的那个)。不过,只有一个临时对象...如果你用
slice
并展开数组来做这个,它涉及到更多的临时对象(slice
的两个数组,它们的迭代器,通过调用迭代器的next
函数[在...
句柄内]创建的结果对象,等等)。它之所以有效,是因为normal JS arrays aren't really arrays 1*(当然,这需要进行优化)*,它们是具有一些特殊特性的对象。它们的“索引”实际上是满足某些条件的属性名2。因此,我们将
this.state.images
扩展到一个新数组中,将其作为目标传递给Object.assign
,并为Object.assign
提供一个具有名为"4"
的属性的对象(是的,它最终是一个字符串,但我们可以将其写成数字),并将其与我们想要更新的值进行匹配。示例:
如果
4
可以是变量,那就可以了,你可以使用一个计算属性名(ES 2015中的新特性):注意
[]
周围的n
。示例:
1披露:这是我贫血博客上的帖子。
2这是项目符号列表后的第二段:
所以
Object.assign
的作用和创建数组然后更新索引4的作用是一样的。yfwxisqw3#
您可以使用Map:
hujrc8aj4#
可以将数组转换为对象(
...array1
),替换项目([1]:"seven"
),然后将其转换回数组(Object.values
):dluptydi5#
这是我的自我解释非一行
bmp9r5qi6#
我参考了@Bardia Rastin解决方案,我发现该解决方案在索引值处有一个错误(它替换了索引为3而不是4的项)。
如果要替换具有索引值index的项,则答案应为
this.state.images.slice(0, index)
是一个新数组,其项从0开始到index - 1(不包括index)this.state.images.slice(index)
是一个新数组,它包含从**index开始的项以及之后的项。要正确替换索引4处的项目,答案应为:
f4t66c6m7#
首先找到索引,这里我使用图像文档id docId作为说明:
8mmmxcuj8#
我已经尝试了很多使用spread操作符的方法。我认为当你使用splice()的时候它会改变主数组。所以我发现的解决方案是用新的变量克隆数组,然后用spread操作符拆分它。我用的例子。