jQuery.unique le 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()
funcionó en números, pero que este caso de uso no es necesariamente una prueba futura porque no se indica explícitamente en los documentos.
Dado esto, ¿existe una función jQuery "estándar" para acceder solo a los valores únicos, específicamente, primitivos como números enteros, en una matriz? (Obviamente, podemos construir un ciclo con la función each()
, pero somos nuevos en jQuery y nos gustaría saber si hay una función jQuery dedicada para esto).
Puede usar array.filter
para devolver el primer elemento de cada valor distinto:
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 la compatibilidad con IE8 e inferior es principal, no use el método de filter
no compatible.
De lo contrario,
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; } }
Simplemente use este código como base de un complemento JQuery simple.
$.extend({ distinct : function(anArray) { var result = []; $.each(anArray, function(i,v){ if ($.inArray(v, result) == -1) result.push(v); }); return result; } });
Usar como tal:
$.distinct([0,1,2,2,3]);
Basado en la respuesta de @kennebec, pero corregido para IE8 y versiones anteriores mediante el uso de envoltorios jQuery alrededor de la matriz para proporcionar el filter
de funciones de matriz faltantes e indexOf
:
Es posible que el contenedor $.makeArray() no sea absolutamente necesario, pero obtendrá resultados extraños si omite 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]