Можно ли ссылаться на анонимный массив в цикле? - PullRequest
8 голосов
/ 01 января 2012
for (var name in ['dog','cat','cow']) {
  alert(name);
}

name здесь возвращает индекс массива, но я не могу ссылаться на него, так как он анонимный.

Я знаю, что могу объявить его вне цикла, но здесь яЯ спрашиваю, есть ли способ ссылки на имя напрямую, без индекса.

Ответы [ 7 ]

13 голосов
/ 01 января 2012

... нет. Нет, не родной цикл, по крайней мере. Однако в ES5 есть forEach :

['dog', 'cat', 'cow'].forEach(function(value, key) {
  // do stuff
});

Что практически одинаково. Он поддерживается в основном везде , за исключением старого IE: что-то вроде es5-shim , например, включает методы ES5 даже в таких старых браузерах.

6 голосов
/ 01 января 2012

У вас есть несколько вариантов.

Если вы используете jQuery, вы можете сделать это:

$.each(['dog','cat','cow'], function() {
    var name = this;
    alert(this);
});

Если вы не используете jQuery, вы можете создать свою собственную функцию

function each(array, pFunction) {
    for(var i = 0; i < array.length; i++) {
        var element = array[i];
        pFunction(element);
    }
}

each(['dog','cat','cow'], function(name) {
    alert(name);
});

Если вы не хотите создавать функцию, вы всегда можете сделать что-нибудь сумасшедшее, например: (не рекомендую)

for (var name in { 'dog' : '','cat' : null,'cow' : null }) {
    alert(name);
}
5 голосов
/ 01 января 2012

Если вы знаете, что ключи массива будут целыми числами, нет ничего, что требовало бы использования конструкции for..in.

for (var arr = ['dog','cat','cow'], name = 0; name < arr.length; name++ ) {
  console.log(arr[ name ]);
}

В приведенном выше коде более простой цикл for позволяет создавать новый объект и ссылаться по ключу внутри цикла.

3 голосов
/ 01 января 2012

Нет, ты не можешь это сделать. Он покажет только индексы. Кроме того, для внутри цикла для массива в JavaScript - плохая практика. Он будет перебирать все объекты массива.

3 голосов
/ 01 января 2012

Если массив анонимный, вы не можете ссылаться на его элементы, используя цикл for in.

2 голосов
/ 02 января 2012

Методы массива forEach, map, filter и т. Д. Будут перебирать индексы литерального массива:

['dog', 'cat', 'cow'].forEach(alert);

Шим для старых браузеров:

if(![].forEach){
    array.prototype.forEach= function(fun, scope){
        var T= this, L= T.length, i= 0;
        if(typeof fun== 'function'){
            while(i< L){
                if(i in T){
                    fun.call(scope, T[i], i, T);
                }
                ++i;
            }
        }
        return T;
    }
}
1 голос
/ 01 января 2012

Для этого вы используете неправильную синтаксическую конструкцию.

for in для перечисления свойств объекта, а не для итерации массивов. Объявите ваш массив снаружи и используйте обычный цикл.

var arr = ['dog', 'cat', 'cow'];
for(var i = 0; i < arr.length; i++) {
  // your code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...