关于字符串数组的jQuery.unique

Joh*_*han 38 jquery

国家描述jQuery.unique():

在适当的位置对DOM元素数组进行排序,并删除重复项.请注意,这仅适用于DOM元素的数组,而不适用于字符串或数字.

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

<div></div>
<div></div>?
Run Code Online (Sandbox Code Playgroud)
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  + ' ');
});
?
Run Code Online (Sandbox Code Playgroud)

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;
};
Run Code Online (Sandbox Code Playgroud)

gio*_*_13 94

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

function unique(array){
    return array.filter(function(el, index, arr) {
        return index === arr.indexOf(el);
    });
}
Run Code Online (Sandbox Code Playgroud)

(演示页)

更新:

为了使这段代码适用于所有浏览器(包括不支持某些数组功能的ie7,例如indexOffilter),这里是使用jquery功能的重写:

现在,这里的翻译代码应如下所示:

function unique(array) {
    return $.grep(array, function(el, index) {
        return index === $.inArray(el, array);
    });
}
Run Code Online (Sandbox Code Playgroud)

(演示页)


gna*_*arf 23

可能适用于数组字符串等,但它并未设计用于该用途......

请注意,代码unique()隐藏在Sizzle中uniqueSort:github source

虽然一些额外的代码似乎可以在任何阵列上工作,但请密切关注sortOrder 此处定义的内容.将事物置于"文档顺序"中会做很多额外的工作 - 因此文档说明它应该仅用于DOM元素的数组.


evc*_*lid 9

我知道DOM的独特作用,但这个在int数组上工作:

$.unique(arr.sort());
Run Code Online (Sandbox Code Playgroud)


xjl*_*in0 7

如果不限制使用jQuery,请考虑使用Set from ES6.

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

适用于Firefox 45,Safari 9和Chrome 49.