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



Answers

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

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




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.




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




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]




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



Links