2011-09-04 19 views
8

hay una manera de obtener todos los valores únicos para un determinado atributo.valores de atributo únicos con jquery

por ejemplo

<div class="bob" data-xyz="fish"></div> 
<div class="bob" data-xyz="dog"></div> 
<div class="bob" data-xyz="fish"></div> 
<div class="bob" data-xyz="cat"></div> 
<div class="bob" data-xyz="fish"></div> 

que necesito para obtener todos los valores distintos para el atributo de datos XYZ en div.bob,

por lo que debe volver peces, perros y gatos.

Respuesta

5

Pequeño código: Crear un objeto y hacer 'perro' 'peces' propiedades 'gato'. Eso los hará únicos. A continuación, obtenga los nombres de propiedad únicos del objeto. Simple y fácil:

var items = {}; 
$('div.bob').each(function() { 
    items[$(this).attr('data-xyz')] = true; 
}); 

var result = new Array(); 
for(var i in items) 
{ 
    result.push(i); 
} 
alert(result); 

http://jsfiddle.net/GxxLj/1/

2
var array = $('div.bob').map(function() { return $(this).data('xyz'); }); 

Eso devolverá todos los valores. Luego puede ejecutarlo a través de una función única.

How do I make an array with unique elements (i.e. remove duplicates)?

function ArrNoDupe(a) { 
    var temp = {}; 
    for (var i = 0; i < a.length; i++) 
     temp[a[i]] = true; 
    var r = []; 
    for (var k in temp) 
     r.push(k); 
    return r; 
} 
array = ArrNoDupe(array); 
+3

Niza uso de mi función! :-) –

3

un seguimiento de los valores que ya ha procesado:

var seen = {}; 

var values = $('div.bob').map(function() { 
    var value = this.getAttribute('data-xyz'); 
    // or $(this).attr('data-xyz'); 
    // or $(this).data('xyz'); 

    if(seen.hasOwnProperty(value)) return null; 

    seen[value] = true; 
    return value; 
}).get(); 

Referencia:$.map()

Esto, por supuesto, sólo funciona con valores primitivos. En caso de que esté mapeando objetos, tendrá que anular el método toString() de los objetos para que puedan usarse como claves.

O como plugin:

(function($) { 

    $.fn.map_unique = function(callback) { 
     var seen = {}; 
     function cb() { 
      var value = callback.apply(this, arguments); 
      if(value === null || seen.hasOwnProperty(value)) { 
       return null; 
      } 
      seen[value] = true; 
      return value; 
     } 
     return this.map(cb); 
    }); 

}(jQuery)); 
Cuestiones relacionadas