M00*_*0HY 4 javascript sorting web vuejs2
vue js 使用属性对对象数组进行排序,并尝试使用另一个属性对已排序的数组进行排序,但 Vue 进入排序的无限循环
chatRoomArraySorted: function() {
console.log("func name chatRoomArraySorted");
function compare(a, b) {
if (a.name < b.name)
return -1;
if (a.name > b.name)
return 1;
return 0;
}
return this.chatRoomsArray.sort(compare);
}
sortedArray: function() {
this.log("sortedArray");
function compare1(a, b) {
return new Date(b.lastMsg.createdAt) - new Date(a.lastMsg.createdAt);
}
return this.chatRoomsArray.sort(compare1);
},
Run Code Online (Sandbox Code Playgroud)
每当计算属性所依赖的任何属性的值发生变化时,计算属性都会更新,这意味着定义函数将被再次调用。
由于您正在调用sort()
两个chatRoomsArray
计算属性中的属性,因此您正在改变chatRoomsArray
数组本身,从而触发两个计算属性的更新。每次运行每个计算属性的函数时都会发生这种情况,从而创建无限循环。
您需要做的是返回chatRoomsArray
每个计算属性的排序副本,而不实际对数组本身进行排序。
concat()
您可以通过像这样调用来创建数组的副本:
return this.chatRoomsArray.concat().sort(compare);
Run Code Online (Sandbox Code Playgroud)
您还可以使用扩展语法来制作副本,如下所示:
return [...this.chatRoomsArray].sort(compare);
Run Code Online (Sandbox Code Playgroud)