javascript - 推送后保持可观察数组排序

标签 javascript algorithm sorting knockout.js

我有两个可观察数组,我需要从第一个数组中删除元素并推送到第二个数组,反之亦然。但是,当我这样做时,字母排序就乱七八糟了。

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();
};

最佳答案

我会考虑两种方法。

  1. 让您的数据始终保持有序。不是调用 .sort(),而是搜索放置元素的正确位置,然后调用 .splice() 将其插入到正确的位置。这是一个O(n) 算法,但在实践中应该很快。
  2. 使用像 https://libraries.io/npm/dsjslib 这样的东西始终保持有序的数据结构。这使得插入/删除成为一个 O(log(n)) 操作。然而,现在每项操作都变得更加复杂。

使用哪一个将取决于您的操作是由插入/删除的工作主导,还是通过运行列表并显示它。我最好的猜测是遍历列表并显示它更重要。

此外,下一个问题是通过扫描数组进行搜索还是通过二分查找更好。扫描是 O(n),但分支预测错误的成本如此之高,以至于我发现它比二进制搜索更快地插入到包含数百个元素的列表中。

关于javascript - 推送后保持可观察数组排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50800891/

相关文章:

java - 默认情况下,即使在启用 Fielddata 后,文本字段上的 Fielddata 也是禁用的

c++ - 为什么我的程序无法对整数字符串进行排序?

javascript - 我如何使用 Greasemonkey 单击此按钮?

python |从屏幕抓取应用程序中整理出冗余文本

从具有自定义一周开始的日期计算一周的算法? (对于 iCal)

c++ - 优化的图像卷积算法

javascript - 为什么多次使用相同的 vue 指令会在所有指令上调用更新?

javascript - 我可以在滚动时以对 Angular 线方式将该图像动画化到屏幕上,并且速度比窗口慢吗?

javascript - 无法隐藏滚动条并保持 div 可滚动

javascript - 如何搜索产品 'item type' 的数组并将其发送到名称为 'Item Type' 的工作表?