从一个数组中得到所有唯一的元素?

惟一的 允许您获得数组的唯一元素,但是文档说这个函数主要用于内部使用,并且只能操作 DOM 元素。另一个 SO 响应说 unique()函数可以处理数字,但是这个用例不一定是未来的证明,因为它没有在文档中明确说明。

在这种情况下,是否有一个“标准”的 jQuery 函数来只访问数组中的唯一值ーー特别是整数这样的原语?(显然,我们可以使用 each()函数构造一个循环,但是我们对 jQuery 是新手,想知道是否有专门的 jQuery 函数来处理这个问题。)

159876 次浏览

可以使用 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;
}
}

遍历数组并在遇到项时将它们推入散列中。交叉引用每个新元素的散列。

注意,这只适用于原语(字符串、数字、空、未定义、 NaN)和一些序列化为相同内容的对象(函数、字符串、日期,可能还有依赖于内容的数组)。当所有的散列序列化为同一个对象时,它们会发生碰撞,例如“[ Object Object ]”

Array.prototype.distinct = function(){
var map = {}, out = [];


for(var i=0, l=this.length; i<l; i++){
if(map[this[i]]){ continue; }


out.push(this[i]);
map[this[i]] = 1;
}


return out;
}

也没有理由不能使用 jQuery. only。我唯一不喜欢的是它破坏了数组的顺序。如果你感兴趣,下面是它的确切代码:

Sizzle.uniqueSort = function(results){
if ( sortOrder ) {
hasDuplicate = baseHasDuplicate;
results.sort(sortOrder);


if ( hasDuplicate ) {
for ( var i = 1; i < results.length; i++ ) {
if ( results[i] === results[i-1] ) {
results.splice(i--, 1);
}
}
}
}


return results;
};

我会使用 下划线 js,它提供了一个 uniq方法来完成您想要的任务。

只需将此代码作为一个简单的 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 包装器来提供缺失的数组函数 filterindexOf,对 IE8及以下版本进行了修复:

$.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]

Paul Irish 有一个“ 打鸭子”方法(参见示例2) ,它修改 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);

您可以使用一个名为 数组实用程序的 jQuery 插件来获得一个惟一项的数组。 可以这样做:

var distinctArray = $.distinct([1, 2, 2, 3])

DistitArray = [1,2,3]

这是 js1568的解决方案,修改后可以处理 一般对象数组,比如:

 var genericObject=[
{genProp:'this is a string',randomInt:10,isBoolean:false},
{genProp:'this is another string',randomInt:20,isBoolean:false},
{genProp:'this is a string',randomInt:10,isBoolean:true},
{genProp:'this is another string',randomInt:30,isBoolean:false},
{genProp:'this is a string',randomInt:40,isBoolean:true},
{genProp:'i like strings',randomInt:60,isBoolean:true},
{genProp:'this is a string',randomInt:70,isBoolean:true},
{genProp:'this string is unique',randomInt:50,isBoolean:true},
{genProp:'this is a string',randomInt:50,isBoolean:false},
{genProp:'i like strings',randomInt:70,isBoolean:false}
]

它接受另一个名为 PropertyName 的参数,猜! :)

  $.extend({
distinctObj:function(obj,propertyName) {
var result = [];
$.each(obj,function(i,v){
var prop=eval("v."+propertyName);
if ($.inArray(prop, result) == -1) result.push(prop);
});
return result;
}
});

因此,如果您需要提取给定属性的唯一值列表,例如用于 Random Int 属性的值,请使用以下方法:

$.distinctObj(genericObject,'genProp');

它返回一个如下的数组:

["this is a string", "this is another string", "i like strings", "this string is unique"]

如果有人正在使用 美女,请尝试:

ko.utils.arrayGetDistinctValues()

顺便说一下,看看所有的 ko.utils.array*实用程序。

    // 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/

function array_unique(array) {
var unique = [];
for ( var i = 0 ; i < array.length ; ++i ) {
if ( unique.indexOf(array[i]) == -1 )
unique.push(array[i]);
}
return unique;
}

从 jquery 3.0开始,您可以使用 $.uniqueSort(ARRAY)

例子

array = ["1","2","1","2"]
$.uniqueSort(array)
=> ["1", "2"]

如果您不需要 IE 支持,那么可以使用普通的 JavaScript 现代解决方案(IE 不支持 Array.from)。

你可以结合使用 SetArray.from

const arr = [1, 1, 11, 2, 4, 2, 5, 3, 1];
const set = new Set(arr);
const uniqueArr = Array.from(set);


console.log(uniqueArr);

Set对象允许您存储任何类型的唯一值,无论是基元值还是对象引用。

Array.from()方法从类似数组或可迭代的对象创建一个新 Array 实例。

也可以用扩展运算符取代 Array.from()

const arr = [1, 1, 11, 2, 4, 2, 5, 3, 1];
const set = new Set(arr);
const uniqueArr = [...set];


console.log(uniqueArr);

如果您需要支持 IE8或更早的版本,可以使用 jQuery 来实现这一点。

var a = [1,2,2,3,4,3,5];
var unique = $.grep(a, function (item, index) {
return index === $.inArray(item, a);
});