2011-08-14 12 views
34

Co znajduje się w najbardziej elegancki sposób na zdobycie tej tablicyjQuery wybierz atrybuty do tablicy

[10, 20, 30, 40, 50] 

z tej listy

<ul> 
    <li value="10">Item One</li> 
    <li value="20">Item Two</li> 
    <li value="30">Item three</li> 
    <li value="40">Item Four</li> 
    <li value="50">Item Five</li> 
</ul> 

przy użyciu jQuery.

Odpowiedz

56

**** edit ****

ok rękawica została rzucona ...

var elements = (document.getElementsByTagName('li')); 
var vals = []; 
for(var i=0;typeof(elements[i])!='undefined';vals.push(elements[i++].getAttribute('value'))); 

nie biblioteka 3 linie kodu ...

zdecydowanie szybszy

enter image description here


var myVals = []; 
$('li','ul').each(function(){ 
    myVals.push($(this).attr('value')); 
}); 

i za pomocą funkcji map jQuery za ...

var myVals = []; 
$('li','ul').map(function(){ 
    myVals.push($(this).attr('value')); 
}); 

i obie są równie szybko .. http://jsperf.com/testing-stuff enter image description here

+0

Czy w takim przypadku można użyć ['map'] (http://api.jquery.com/map/)? –

+0

+1, bo jestem o 39 sekund szybszy ode mnie. :) –

+0

mapa naprawdę nie miałaby sensu ... widząc, że po prostu wyodrębniasz wartości, a nie elementy DOM – samccone

7
var outVal = []; 
$('ul li').each(function(idx, el){ 
    outVal.push($(this).attr('value')); 
}); 
+1

+1 za bycie o 39 sekund wolniejszym ode mnie. :) – samccone

+0

ha, ale mój jest szybszy! http: // jsperf.com/porównywanie-selektory jquery – samccone

4

Mówiąc o eleganckim kodu , możemy uzyskać lepsze rozwiązanie za pomocą znaku podkreślenia w połączeniu z jQuery:

_($('ul li').toArray()).map(function(e) { return e.value }) 

A skoro już przy tym jesteśmy, dlaczego nie zrzucić Javascript dla coffeescript:

_($('ul li').toArray()).map (e) -> e.value 

;-)

+0

jQuery ma już '$ .map' i' .map' (działa podobnie jak flatmap). Ale +1 za korzystanie z mapy. –

+0

Tak, zapomniałem, że jQuery miał ten, jestem całkowicie uzależniony od Podkreślenia, jak się wydaje! –

+0

ha @nicolas ... fajny Mam mój do 3 linii i bez bibliotek :) – samccone

25

myślę, że mapa działa dobrze .. po prostu nie w łańcuchu.

var vals = $.map($("li[value]"), function(li) { 
    return $(li).attr("value"); 
}); 
+0

ok @pst dostał go do 3 linii kodu i bez biblioteki :) – samccone

+6

@samccone interesujące, że "brak biblioteki" jest preferowany dla pytania z prośbą o rozwiązanie "używając jquery". – natedavisolds

+0

Jest to również "najbardziej elegancki", jak pytanie. Prędkość nie ma znaczenia dla tak małego biegu, ale wciąż miło to widzieć. – Ael