valor tiene saber obtener modificar elemento data con boton atributo agregar javascript jquery jquery-selectors

javascript - tiene - jQuery función para obtener todos los elementos únicos de una matriz?



obtener valor de un boton jquery (13)

jQuery.unique permite obtener elementos únicos de una matriz, pero los documentos dicen que la función es principalmente para uso interno y solo opera en elementos DOM. Otra respuesta de SO dijo que la función unique() funcionaba con los números, pero que este caso de uso no es necesariamente a prueba en el futuro porque no está explícitamente establecido en los documentos.

Teniendo esto en cuenta, ¿existe una función jQuery "estándar" para acceder solo a los valores únicos, específicamente primitivas, como los enteros, en una matriz? (Obviamente, podemos construir un bucle con la función each() , pero somos nuevos en jQuery y nos gustaría saber si hay una función jQuery dedicada para esto).


A partir de jquery 3.0, puede usar $.uniqueSort(ARRAY)

Ejemplo

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


Basado en la respuesta de @ kennebec, pero corregido para IE8 y versiones posteriores mediante el uso de envoltorios jQuery alrededor de la matriz para proporcionar las funciones de la matriz faltantes filter and indexOf :

Es posible que el contenedor $ .makeArray () no sea absolutamente necesario, pero obtendrás resultados impares si omites este contenedor y JSON.stringifica el resultado de lo contrario.

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]


Camina por la matriz y coloca los elementos en un hash cuando te encuentres con ellos. Haga una referencia cruzada del hash para cada nuevo elemento.

Tenga en cuenta que esto SÓLO funcionará correctamente para primitivas (cadenas, números, nulos, indefinidos, NaN) y algunos objetos que se serializan a la misma cosa (funciones, cadenas, fechas, posiblemente matrices, según el contenido). Los hash en esto colisionarán ya que todos se serializan a la misma cosa, por ejemplo, "[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; }

Tampoco hay ninguna razón por la que no puedas usar jQuery.unique. Lo único que no me gusta es que destruye el orden de tu matriz. Aquí está el código exacto si te interesa:

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


Paul Irish tiene un método de " perforación de patos " (ver ejemplo 2) que modifica el $.unique() jQuery para devolver elementos únicos de cualquier tipo:

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


Puede usar array.filter para devolver el primer elemento de cada valor distintivo-

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

Si el soporte de IE8 e inferior es primario, no use el método de filter no admitido.

De otra manera,

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


Puede usar un complemento jQuery llamado Array Utilities para obtener una matriz de elementos únicos. Se puede hacer así:

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

distinctArray = [1,2,3]


Si alguien está usando knockoutjs intente:

ko.utils.arrayGetDistinctValues()

Por cierto, mira todas las utilidades ko.utils.array* .


Simplemente use este código como la base de un plugin JQuery simple.

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

Use como tal:

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


Solución moderna de JavaScript simple si no necesita soporte de IE ( Array.from no es compatible con IE).

Puede usar la combinación de Set y Array.from .

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

El objeto Set permite almacenar valores únicos de cualquier tipo, ya sean valores primitivos o referencias a objetos.

El método Array.from crea una nueva instancia de Array a partir de un objeto similar a una matriz o iterable.


Utilizaría underscore.js , que proporciona un método uniq que hace lo que quiere.


esta es la solución de js1568, modificada para trabajar en una matriz genérica de objetos, como:

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} ]

Acepta un parámetro más llamado propertyName, ¡adivina! :)

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

por lo tanto, si necesita extraer una lista de valores únicos para una propiedad determinada, por ejemplo, los valores utilizados para la propiedad randomInt, use esto:

$.distinctObj(genericObject,''genProp'');

devuelve una matriz como esta:

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


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

Y para los elementos dom, aquí no se necesita ningún ejemplo, supongo porque ¡ya lo sabes!

Aquí está el enlace jsfiddle del ejemplo en vivo: 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; }