我理解array.push()
返回变异数组而不是新长度的期望。并且出于链接原因希望使用此语法。
但是,有一种内置的方法可以做到这一点:array.concat()
. 请注意,concat
期望得到一个数组,而不是一个项目。因此,请记住将要添加的项目包装起来[]
,如果它们尚未在数组中。
newArray = oldArray.concat([newItem]);
数组链接可以通过 using 来完成.concat()
,因为它返回一个数组,
但不能通过 来完成.push()
,因为它返回一个整数(数组的新长度)。
以下是用于React
根据state
变量的先验值更改变量的常见模式:
// the property value we are changing
selectedBook.shelf = newShelf;
this.setState((prevState) => (
{books: prevState.books
.filter((book) => (book.id !== selectedBook.id))
.concat(selectedBook)
}
));
state
object 有一个books
属性,该属性包含一个book
.
book
是一个具有id
, 和shelf
属性(等等)的对象。
setState()
接收一个包含要分配给的新值的对象state
selectedBook
已在books
数组中,但其属性shelf
需要更改。然而,
我们只能给出setState
一个顶级对象。
我们不能告诉它去寻找这本书,并在这本书上寻找一个属性,并赋予它这个新值。
所以我们按books
原样使用数组。
filter
删除 的旧副本selectedBook
。
然后在更新它的属性后concat
重新添加。selectedBook
shelf
想要链接push
.
但是,正确的方法实际上是使用concat
.
总结:
array.push()
将返回一个数字(变异数组的新长度)。
array.concat([])
将返回一个新的“变异数组。
从技术上讲,它返回一个新的数组,其中添加了修改后的元素,并保持初始数组不变。返回一个新的数组实例,与回收现有数组实例相反,这是一个重要的区别,这使得 React 应用程序中的状态对象非常有用,可以获取更改的数据以重新渲染。