【问题标题】:How to return unique and sorted array values useing jQuery? [duplicate]如何使用 jQuery 返回唯一且已排序的数组值? [复制]
【发布时间】:2012-12-29 11:57:06
【问题描述】:

可能重复:
Javascript array sort and unique

我很惊讶地发现没有内置的 jQuery 函数。

我在 stackoverflow 上看到了很多解决方案,但是问题被无效的答案污染了(要找到一个有效的答案,我必须全部测试)。

因此,为了将来参考和免去其他用户的麻烦,我决定发布这种问答风格。

如何使用 jQuery 返回唯一且有序的数组值?

数字:

// input array
var inputArray = [10, 5, 15, 10, 5, 15];

// expected result array
var resultArray = [5, 10, 15];

字符串:

// input array
var inputArray = ['b', 'a', 'c', 'b', 'a', 'c'];

// expected result array
var resultArray = ['a', 'b', 'c'];

【问题讨论】:

  • 哇,你同时回答了自己的问题?
  • @Sibu 这在 SO 上是完全合法的:如果你解决了一个问题并且有一个可以帮助其他人的解决方案,你可以做 OP 所做的事情。但在这个具体案例中,我认为它不够有趣,因为它还经常被回答。
  • @dystroy 同意了,但是当你知道答案时为什么要问一个问题,如果你看到 OP 问题时间和回答时间,两者几乎相同..有趣不是吗?
  • 原因是为了帮助其他人:如果这个问题是新的和有趣的,并且你认为你有特殊的知识,那么你可以把它带给大众。见this

标签: jquery arrays sorting unique


【解决方案1】:

作为一个函数:

function sort_unique(arr) {
    return arr.sort(function(a,b){
        return (a > b) ? 1 : -1;
    }).filter(function(el,i,a) {
        return (i==a.indexOf(el));
    });
}

【讨论】:

  • 我从未说过我的解决方案是最快的。我发布了一个简单且有效的解决方案。问题不是“最快的方法是什么……”?
【解决方案2】:

希望这对你有用

var dummy = [10, 5, 15, 10, 5, 15];
var arr = [];
$.map(arr, function(n, i){
  if($.inArray(n, arr) == -1)
      arr.push(n);
});

现在在 arr 值是唯一的。现在您可以对此应用任何排序算法。

【讨论】:

    【解决方案3】:

    我将自行在此处添加我的答案,而不是之前提出的问题,仅仅是因为之前提出的问题中的答案很糟糕,但我不希望作者改变决定。

    现在,让您更直观地了解我提出的解决方案:排序是 O(n log n),删除重复项是 O(n),因此我们得出结论,整个操作应该不会比 n log 复杂n.但是,如果您考虑一下,n 永远不会增加,但如果您首先删除重复项,然后 然后 排序,则很可能会减少。因此,虽然表面上它仍然是 O(n log n),但它通常会更快。您可能可以通过将值收集到树而不是哈希表中来改进它(在其他语言中),但是鉴于 JavaScript 中“本机”数据结构和自定义数据结构之间在性能上的巨大差异 - 下面的解决方案应该是最佳的:

    function sortUnique(array) {
        "use strict";
        var table = {}, key, i;
        for (i = 0; i < array.length; i++) {
            table[[array[i]]] = '';
        }
        i = 0;
        for (key in table) {
            array[i++] = key;
        }
        array.length = i;
        return array.sort();
    }
    sortUnique(['b', 'a', 'c', 'b', 'a', 'c']);
    // [ 'a', 'b', 'c' ]
    

    【讨论】:

    • 你确定它更快吗?特别是对于一个不大的数组?
    • 我会测试你的解决方案,如果它有效并且速度更快,我显然会将其标记为正确,不需要像“但我不希望作者改变决定”这样的 cmets。
    • 我将其标记为已接受,因为它有效,而且我学到了有关性能的课程。 tyvm wvxvw
    • 如果数组包含数字或日期,此算法会将它们转换为 IE 或 node.js 中的字符串。原因是(如果我明白的话)table[[...]] 是一个非标准功能,仅存在于 ECMA6 草案中,尚未在 IE 中实现(比上述答案晚 2 年!)。在 ECMA5 中,object keys must always be converted to strings.
    猜你喜欢
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 2020-09-06
    • 2014-08-19
    • 1970-01-01
    • 2012-03-06
    • 2017-01-02
    • 2015-03-14
    相关资源
    最近更新 更多