43

状态描述jQuery.unique()

对 DOM 元素数组进行就地排序,删除重复项。请注意,这只适用于 DOM 元素的数组,而不适用于字符串或数字。

考虑到描述,有人可以解释为什么下面的代码有效吗?

<div></div>
<div></div>​

var arr = ['foo', 'bar', 'bar'];

$.each(arr, function(i, value){
    $('div').eq(0).append(value + ' ');
});

$.each($.unique(arr), function(i, value){
    $('div').eq(1).append(value  + ' ');
});
​

http://jsfiddle.net/essX2/

谢谢

编辑:可能的解决方案:

function unique(arr) {
var i,
    len = arr.length,
    out = [],
    obj = { };

for (i = 0; i < len; i++) {
    obj[arr[i]] = 0;
}
for (i in obj) {
    out.push(i);
}
return out;
};
4

8 回答 8

103

虽然它有效,但您可能应该考虑功能描述。如果创建者说它不是为过滤除 dom 元素之外的任何数组而设计的,那么您可能应该听听他们的意见。
此外,此功能很容易复制:

function unique(array){
    return array.filter(function(el, index, arr) {
        return index === arr.indexOf(el);
    });
}

演示页面

更新:

为了让这段代码在所有浏览器(包括不支持某些数组功能的 ie7 - 例如indexOfor filter)中工作,这里使用 jquery 功能重写:

现在这是翻译后的代码的样子:

function unique(array) {
    return $.grep(array, function(el, index) {
        return index === $.inArray(el, array);
    });
}

演示页面

于 2012-04-17T13:31:56.773 回答
23

可能适用于数组字符串等,但它不是为这种用途而设计的......

请注意,代码unique()隐藏在 Sizzle 中uniqueSortgithub 源

虽然其中一些额外的代码看起来可能适用于任何数组,但请密切注意sortOrder 此处定义的内容。它做了很多额外的工作来把东西放在“文档顺序”中——因此文档说明它应该只用于 DOM 元素的数组。

于 2012-04-17T13:18:37.420 回答
15

我知道 DOM 的独特作品,但这适用于 int 数组:

$.unique(arr.sort());
于 2013-11-14T14:04:50.180 回答
9

如果不限制使用 jQuery,请考虑使用 ES6 中的 Set。

var arr = ['foo', 'bar', 'bar'];
Array.from(new Set(arr)); // #=> ["foo", "bar"]

适用于 Firefox 45、Safari 9 和 Chrome 49。

于 2016-03-28T20:16:47.460 回答
4

$.unique将删除重复的 DOM 元素,而不是相同的DOM 元素。当您尝试在字符串上使用它时,您会得到不可预测的行为,并且排序将(可能)失败。

这是一个仅供 jQuery 内部使用的函数,对像你我这样的凡人没有用处。

于 2012-04-17T13:15:17.473 回答
3

有一种快速的方法可以扩展 jQuery.unique() 函数以处理包含任何类型元素的数组。

(function($){

    var _old = $.unique;

    $.unique = function(arr){

        // do the default behavior only if we got an array of elements
        if (!!arr[0].nodeType){
            return _old.apply(this,arguments);
        } else {
            // reduce the array to contain no dupes via grep/inArray
            return $.grep(arr,function(v,k){
                return $.inArray(v,arr) === k;
            });
        }
    };
})(jQuery);

// in use..
var arr = ['first',7,true,2,7,true,'last','last'];
$.unique(arr); // ["first", 7, true, 2, "last"]

var arr = [1,2,3,4,5,4,3,2,1];
$.unique(arr); // [1, 2, 3, 4, 5]

http://www.paulirish.com/2010/duck-punching-with-jquery/ - 示例 #2

于 2014-05-28T19:15:38.380 回答
0

$.unique 只会删除重复的 DOM 元素,如果您需要它用于数组:

var result=[] ;
$.each([12,1,2,4,3,1,4,3,3,2,111], 
        function(i,e){ if($.inArray(e,result)===-1) result.push(e) ;});
result;
于 2013-11-01T14:12:43.057 回答
0
var array=['a','b','c','a'];

    function unique(array)
    {
    var unique_arr=[];
    array.forEach(function(i,e)
    {
    if(unique_arr.indexOf(i)===-1) unique_arr.push(i);
    });
    return unique_arr;
    }
    console.log(unique(array));
于 2019-11-14T08:45:25.273 回答