Строки в массиве больше не являются строками после jQuery.each () - PullRequest
14 голосов
/ 26 марта 2010

Я довольно смущен поведением массивов строк, когда я зацикливаю их с помощью метода jQuery.each(). Очевидно, строки становятся объектами jQuery внутри функции обратного вызова. Однако я не могу использовать метод this.get() для получения исходной строки; при этом this.get не является сообщением об ошибке функции. Я полагаю, причина в том, что это не DOM-узел. Я могу сделать $(this).get(), но моя строка становится массивом (от "foo" до ["f", "o", "o"]).

Как я могу привести его обратно к строке? Мне нужно получить переменную типа String, потому что я передаю ее другим функциям, которые сравнивают значения между ними.

Я прилагаю автономный контрольный пример (требуется консоль Firebug):

<!DOCTYPE html>
<html>
<head><title></title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript"><!--
$(function(){
    var foo = [];
    var $foo = $(foo);

    foo.push("987");
    $foo.push("987");

    foo.push("654");
    $foo.push("654");

    $.each(foo, function(i){
        console.log("foo[%d]: object=%o; value=%s; string=%o", i, this, this, $(this).get()); // this.get() does not exist
    });
    $foo.each(function(i){
        console.log("$foo[%d]: object=%o; value=%s; string=%o", i, this, this, $(this).get()); // this.get() does not exist
    });
});
//--></script>
</head>
<body>

</body>
</html>

Ответы [ 2 ]

13 голосов
/ 26 марта 2010

редактирование / уточнение: функции обратного вызова принимают два аргумента, второй - значение переменной. Используйте это вместо this Я проверил оба варианта, и все, кажется, работает как ожидалось (строки все еще строки).

>>> $.each(['foo','bar'], function(i, s){ console.info( s, typeof s ) })
foo string
bar string

>>> $(['foo','bar']).each(function(i, s){ console.info( s, typeof s ) })
foo string
bar string
3 голосов
/ 26 марта 2010

Это работает в моем Firefox 3.5:

$(function(){
    var foo = [];

    foo.push("abc");
    foo.push("def");

    $.each(foo, function(i){
        console.log(typeof ("" + this)); 
        });
});

Консоль показывает

string
string
...