我有两个可观察数组,我需要从第一个数组中删除元素并推送到第二个数组,反之亦然。但是,当我这样做时,字母排序就乱七八糟了。
self.allCourses = ko.observableArray([]);
self.selectedCourses = ko.observableArray([]);
我将在两个数组之间交换类(class),并使用它:
self.sortArrays = function(){
self.allCourses.sort(function (l, r) {
return l.code() < r.code() ;
});
self.selectedCourses.sort(function (l, r) {
return l.code() < r.code() ;
});
}
不仅效率不高,而且没有按预期工作;我每次调用这些函数之一时都会调用该函数
self.addCourse = function(course){
self.selectedCourses.push(course);
self.allCourses.remove(course);
self.sortArrays();
};
self.removeCourse = function(course){
self.allCourses.push(course);
self.selectedCourses.remove(course);
self.sortArrays();
};
最佳答案
我会考虑两种方法。
- 让您的数据始终保持有序。不是调用
.sort()
,而是搜索放置元素的正确位置,然后调用.splice()
将其插入到正确的位置。这是一个O(n)
算法,但在实践中应该很快。 - 使用像 https://libraries.io/npm/dsjslib 这样的东西始终保持有序的数据结构。这使得插入/删除成为一个
O(log(n))
操作。然而,现在每项操作都变得更加复杂。
使用哪一个将取决于您的操作是由插入/删除的工作主导,还是通过运行列表并显示它。我最好的猜测是遍历列表并显示它更重要。
此外,下一个问题是通过扫描数组进行搜索还是通过二分查找更好。扫描是 O(n)
,但分支预测错误的成本如此之高,以至于我发现它比二进制搜索更快地插入到包含数百个元素的列表中。
关于javascript - 推送后保持可观察数组排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50800891/