javascript - 对数组进行排序时删除重复项

标签 javascript arrays sorting

我有一个包含需要排序的对象的数组,并根据每个数组项的 3 个特定值删除重复项。目前我正在使用两个循环(非嵌套):一个用于排序,另一个用于删除项目。有没有办法在排序或类似的情况下删除重复项?对于 1000 个项目,以下代码非常慢,我想知道是否有更快的方法:

var list = [
    {a: "Somename", b: "b", c: 10},
    {a: "Anothername", b: "a", c: 12},
    // and so on
];
function sortList(list) {
    // Sort the list based on the 3 specific values
    list = list.sort(function(a,b) {
        a.a = a.a.toLowerCase();
        b.a = b.a.toLowerCase();
        if (a.a < b.a) return -1;
        if (a.a > b.a) return 1;

        a.b = a.b.toLowerCase();
        b.b = b.b.toLowerCase();
        if (a.b < b.b) return -1;
        if (a.b > b.b) return 1;

        if (a.c < b.c) return -1;
        if (a.c > b.c) return 1;

        return 0;
    });

    // Loop through removing duplicates
    for (var a,b,i=list.length-1; i > 0; i--) {
        a = list[i];
        a.a = a.a.toLowerCase();
        a.b = a.b.toLowerCase();

        b = list[i-1];
        b.a = b.a.toLowerCase();
        b.b = b.b.toLowerCase();

        if (a.a===b.a && a.b===b.b && a.c===b.c) list.splice(i-1,1);
    }

    return list;
}
list = sortList(list);

请不要使用 jQuery 答案,或建议使用其他库的答案。导入一个库来做这么简单的事情似乎有点过分了。

最佳答案

不要在第二个循环中使用splice,只需将唯一值放入新数组中即可。因此,在每次迭代中,您只需将值附加到新数组,而不是拼接现有数组; pushsplice 快得多。例如:

var newList = [];
if (list) {
    newList.push(list[0];
    for (var a,b,i=1; i < list.length; i++) {
        a = list[i];
        a.a = a.a.toLowerCase();
        a.b = a.b.toLowerCase();

        b = list[i-1];
        b.a = b.a.toLowerCase();
        b.b = b.b.toLowerCase();

        if (a.a!==b.a || a.b!==b.b && a.c!==b.c) {
            newList.push(a);
        }
    }
}

关于javascript - 对数组进行排序时删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12003005/

相关文章:

javascript - 使用await Promise.all 获取已解析对象的更简洁方法

javascript - 如何从 DOM 获取元素并设置 onclick 事件?

ios - 需要在 UITableView 中创建不同的部分

c - 按顺序合并(交错)两个排序的数组(但合并后不排序)

javascript - Froala 编辑器 : focus cursor on page load

javascript - ExtJS 使用 Ext.KeyMap 监听全局击键

javascript - 通过 websocket 发送时,JSON 将 Float32Array 缓冲区大小增加了很多倍

char数组写入文件

java - 合并大文件的算法

sorting - Haskell 中的快速排序