jQuery函数从数组中获取所有独特的元素?

jQuery.unique让你得到一个数组的独特元素,但文档说这个函数主要是内部使用的,只能在DOM元素上运行。 另一个SO响应表示unique()函数处理数字,但这个用例不一定是未来的certificate,因为它没有在文档中明确说明。

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

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

只要使用这个代码作为一个简单的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的答案,但固定IE8和以下使用jQuery包装周围的数组提供缺less的数组函数filterindexOf

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

 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] 

我会使用underscore.js ,它提供了一个uniq方法,可以做你想做的事情。

走过arrays,并在遇到它们时将项目推入散列。 交叉引用每个新元素的散列。

请注意,这将只适用于原语(string,数字,空,未定义,NaN)和一些序列化相同的东西(函数,string,date,可能数组取决于内容)的一些对象。 当它们都序列化到相同的东西时,这里的哈希会相互碰撞,例如“[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.unique。 我不喜欢它的唯一的事情是它破坏了你的数组的sorting。 如果你感兴趣,下面是它的确切代码:

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

Paul Irish有一个“ Duck Punching ”方法(参见示例2),它修改了jQuery的$.unique()方法以返回任何types的唯一元素:

 (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); 

这是js1568的解决scheme,修改为在一个通用的对象数组上工作,如:

  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; } }); 

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

 $.distinctObj(genericObject,'genProp'); 

它返回一个这样的数组:

 ["this is a string", "this is another string", "i like strings", "this string is unique"] 
 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; } 

您可以使用名为Array Utilities的jQuery插件来获取唯一项目的数组。 可以这样做:

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

distinctArray = [1,2,3]

如果有人正在使用knockoutjs尝试:

 ko.utils.arrayGetDistinctValues() 

顺便说一句,看看所有的ko.utils.array*工具。

普通的JavaScript现代化解决scheme,如果你不需要IE支持(IE中不支持Array.from )。

您可以使用SetArray.from组合。

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

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

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