2013-07-05 25 views
14

Biorąc pod uwagę to:

<a href="1">1</a> 
<a href="2">2</a> 

Oto funkcja zwraca tablicę wartości href:

e = $('a').map(function(v) { return $(this).attr('href'); }); 
console.log(e); 

Ale daje

["1", "2", prevObject: x.fn.x.init[2], context: document, jquery: "1.10.2", constructor: function, init: function…] 

Jak mogę zmodyfikować to aby zwrócić tylko raw array ["1", "2"]?

+0

Jako Twój 'console.log' zwraca uwagę, to nie są twoi href wartości. –

+2

Dlatego powinieneś * nigdy * całkowicie zaufać wynikowi konsoli (przynajmniej 'console.log',' console.dir' powinno być w porządku). Ponieważ obiekt jQuery jest obiektem typu * array-like *, 'console.log' wyświetla go jako tablicę. Inna przeglądarka może wyświetlać inne wyniki. –

+0

OK, zadzwoń do mnie. Wszelkie sugestie, jak to zrobić, aby zwrócić surową tablicę? (Zmodyfikowałem moje pytanie odzwierciedlające punkt Davida) – user537339

Odpowiedz

28

To dlatego jQuery.fn.map zwraca nowy jQuery obiektu, należy użyć jQuery.fn.get aby uzyskać tablicę:

var a = $('a').map(function(v, node) { 
    // v is the index in the jQuery Object, 
    // you would maybe like to return the domNode or the href or something: 
    // return node.href; 

    return v; 
}).get(); // <-- Note .get() converts the jQuery Object to an array 

Micro optymalizacja:

Jeśli spojrzeć na kodzie źródłowym jQuery.fn.get możesz zobaczyć, że wskazuje ona na jQuery.fn.toArray:

function (num) { 
    return num == null ? 

     // Return a 'clean' array 
     this.toArray() : 

     // Return just the object 
     (num < 0 ? this[ this.length + num ] : this[ num ]); 
} 

Więc można również zadzwonić:

$('a').map(...).toArray();