индекс суммы в JavaScript foreach - PullRequest
       6

индекс суммы в JavaScript foreach

0 голосов
/ 09 августа 2011

В следующем примере кода я получаю странное поведение

var data = ['xxx', 'yyy'];
for (var i in data)
{
    var a = i;
    var b = data[i];
}

Две первые итерации работают просто отлично.Я получаю индексы "0" и "1" в i, но затем он зацикливается еще один раз, и теперь i равен "sum".Это по замыслу или для чего используется эта дополнительная итерация?Результат в моем случае всегда пуст, и это портит мой код.Есть ли способ не делать его лишнюю петлю?

BR Andreas

Ответы [ 5 ]

6 голосов
/ 09 августа 2011

Похоже, вы (или другой код, который вы включили) добавили дополнительные свойства в прототип Array. Вам следует проверить, действительно ли объект, по которому вы перебираете объекты, имеет это свойство на самом , а не на своем прототипе:

for (i in data) {
    if (data.hasOwnProperty(i)) {
        a = i;
        b = data[i];
    }
}

Тем не менее, вы никогда не должны использовать for .. in для массивов. Используйте обычный цикл for.

Смотрите здесь для получения дополнительной информации: http://yuiblog.com/blog/2006/09/26/for-in-intrigue/

4 голосов
/ 09 августа 2011

Вы просматриваете Array, а не Object. Для массивов лучше использовать:

for (var i=0; i<data.length; i=i+1){
  /* ... */
}

В вашем цикле учитывается каждое свойство объекта Array. Это делает цикл for ... in для массива менее предсказуемым. В вашем случае это выглядит так: sum - это свойство (метод), добавленное к Array.prototype в другом месте вашего кода.

Есть и другие способы просмотра массивов. См. Например этот SO-вопрос или этот

Ради интереса, более эзотерический способ зацикливания массива

Array.prototype.loop = function(fn){
  var t = this;
  return (function loop(fn,i){
   return i ? loop(fn,i-1).concat(fn(t[i-1])) : [];
  }(fn,t.length));
}
//e.g.
//add 1 to every value
var a = [1,2,3,4,5].loop(function(val){return val+1;});
alert(a); //=> [2,3,4,5,6]
//show every value in console
var b = [1,2,3,4,5].loop(function(val){return console.log(val), val;});
2 голосов
/ 09 августа 2011

Вот способ безопасной итерации.

var data = ['xxx', 'yyy'];
for (var i = 0; i < data.length; i++)
{
    var a = i;
    var b = data[i];
}

То, что вы получаете, - это метод расширения объекта Array, я полагаю, вы используете какую-то библиотеку, где что-то вроде Array.prototype.sum = function () {...};

1 голос
/ 09 августа 2011

Прежде всего data - это объект. Попробуйте добавить console.log (a); и console.log (b); внутри вашей петли, и вы увидите.

1 голос
/ 09 августа 2011

Возможно, установка таких данных будет работать лучше: var data = {0:'xxx', 1:'yyy'};

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...