2013-07-05 5 views
14

Учитывая это:

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

Вот функция возвращает массив HREF значений:

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

Но это дает

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

Как я могу изменить это только возвращать raw array ["1", "2"]?

+0

Как ваш 'console.log' указывает, те не ваши HREF значения. –

+2

Вот почему вы никогда не должны полностью доверять консольному выпуску (по крайней мере, 'console.log',' console.dir' должно быть хорошо). Поскольку объект jQuery является * подобным массиву * объекту, 'console.log' отображает его как массив. Другой браузер может показывать другой результат. –

+0

OK честный вызов. Любые предложения о том, как сделать это, чтобы вернуть необработанный массив? (изменили мой вопрос, чтобы отразить точку Дэвида) – user537339

ответ

28

Это происходит потому, что jQuery.fn.map возвращает новый JQuery объект, вы должны использовать jQuery.fn.get, чтобы получить массив:

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 оптимизация:

Если вы посмотрите на исходный код jQuery.fn.get вы можете видеть, что он указывает на то, что он указывает на 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 ]); 
} 

Таким образом, вы также можете позвонить:

$('a').map(...).toArray(); 
Смежные вопросы