jQuery 函数从数组中获取所有唯一元素?

IT技术 javascript jquery jquery-selectors
2021-01-24 19:24:19

jQuery.unique可让您获取数组的唯一元素,但文档说该函数主要供内部使用,并且仅对 DOM 元素进行操作。另一个 SO 回应说该unique()函数适用于数字,但是这个用例不一定是未来的证明,因为它没有在文档中明确说明。

鉴于此,是否有一个“标准”的 jQuery 函数来仅访问数组中的唯一值——特别是像整数这样的基元?(显然,我们可以用该each()函数构造一个循环,但我们是 jQuery 新手,想知道是否有专门的 jQuery 函数。)

6个回答

您可以使用array.filter返回每个不同值的第一项 -

var a = [ 1, 5, 1, 6, 4, 5, 2, 5, 4, 3, 1, 2, 6, 6, 3, 3, 2, 4 ];

var unique = a.filter(function(itm, i, a) {
    return i == a.indexOf(itm);
});

console.log(unique);

如果支持 IE8 及以下是主要的,请不要使用不受支持的filter方法。

否则,

if (!Array.prototype.filter) {
    Array.prototype.filter = function(fun, scope) {
        var T = this, A = [], i = 0, itm, L = T.length;
        if (typeof fun == 'function') {
            while(i < L) {
                if (i in T) {
                    itm = T[i];
                    if (fun.call(scope, itm, i, T)) A[A.length] = itm;
                }
                ++i;
            }
        }
        return A;
    }
}
@cwolves 的回答应该是公认的。这个答案以及几乎所有其他答案都在 O(n^2) 时间内运行,如果您在大数组上尝试它速度非常非常慢。
2021-03-20 19:24:19
或使用众多 EcmaScript 5 垫片之一,例如Kriskowal 的这个
2021-03-22 19:24:19
简单的答案,棒极了。
2021-04-05 19:24:19
从 IE9 开始支持,有关更多信息,请访问developer.mozilla.org/en-US/docs/JavaScript/Reference/...
2021-04-09 19:24:19
警告:在IE8上面的代码休息和以下,不具有任何原生支持Array.filterArray.indexOf请参阅我对此答案的修订,了解在支持 jquery 的浏览器中不会中断的代码。
2021-04-10 19:24:19

只需将此代码用作简单 JQuery 插件的基础即可。

$.extend({
    distinct : function(anArray) {
       var result = [];
       $.each(anArray, function(i,v){
           if ($.inArray(v, result) == -1) result.push(v);
       });
       return result;
    }
});

像这样使用:

$.distinct([0,1,2,2,3]);

基于@kennebec 的回答,但通过在数组周围使用 jQuery 包装器来提供缺少的 Array 函数filterIE8 及以下版本进行了修复indexOf

$.makeArray() 包装器可能不是绝对需要的,但如果你省略这个包装器和 JSON.stringify 否则你会得到奇怪的结果。

var a = [1,5,1,6,4,5,2,5,4,3,1,2,6,6,3,3,2,4];

// note: jQuery's filter params are opposite of javascript's native implementation :(
var unique = $.makeArray($(a).filter(function(i,itm){ 
    // note: 'index', not 'indexOf'
    return i == $(a).index(itm);
}));

// unique: [1, 5, 6, 4, 2, 3]
似乎不再起作用,将过滤器更改为: return i == $.inArray(itm, a);
2021-03-31 19:24:19

我会使用underscore.js,它提供了一种uniq方法来做你想做的事。

    // for numbers
    a = [1,3,2,4,5,6,7,8, 1,1,4,5,6]
    $.unique(a)
    [7, 6, 1, 8, 3, 2, 5, 4]

    // for string
    a = ["a", "a", "b"]
    $.unique(a)
    ["b", "a"]

对于 dom 元素,我想这里不需要示例,因为您已经知道了!

这是现场示例的 jsfiddle 链接:http : //jsfiddle.net/3BtMc/4/

但是文档说 $.unique()适用于 DOM 元素!“原地对 DOM 元素数组进行排序,删除重复项。请注意,这仅适用于 DOM 元素数组,不适用于字符串或数字。” -- api.jquery.com/jquery.unique
2021-03-31 19:24:19