Итерация массива JavaScript с использованием for..in с включенным MooTools - PullRequest
4 голосов
/ 11 января 2010

Я перебираю массив в MooTools, но вижу дополнительные элементы при переборе массива с использованием сокращенного цикла for..in. Он отлично работает, когда я использую обычный цикл for. Это проблема с MooTools, загрязняющим глобальное пространство имен, или я здесь что-то не так делаю?

Существует функция createTabs(), которая перебирает массив и создает вкладку для каждого значения в массиве:

function createTabs() {
    var myTabs = [["First", "a.png"], ["Second", "b.png"]];
    for(var i in myTabs) {
        var tab = new Tab(myTabs[i][0], myTabs[i][1]);
        console.log(i);
    }
}

Это вывод console.log(i):

0
1
$family
each
clean
associate
link
contains
extend
getLast
getRandom
include
combine
erase
empty
flatten
hexToRgb
rgbToHex
toJSON

Я понимаю первые 2 индекса, но откуда остальные?

Редактировать : Спасибо за быстрые ответы Chetan и k Prime. Это имеет смысл, и добавление Array.each от MooTools - намного более чистый способ повторения!

Теперь выглядит намного лучше:

myTabs.each(function(item) {
    var tab = new Tab(item[0], item[1]);
    console.log(item);
});

Ответы [ 2 ]

9 голосов
/ 11 января 2010

Как отметил Четан, for .. in предназначен для итерации свойства объекта, а не для массивов. однако вы можете перебирать текущие элементы (а не унаследованные элементы, заданные MooTools), используя hasOwnProprty, например:

for (i in array)
    if (array.hasOwnProperty(i))
    {
        //.. do stuff ...
    }

Орр, еще лучше, поскольку вы используете MooTools, просто используйте метод Array.each:

array.each (function (item, index)
{
    // ... do stuff ...
});
6 голосов
/ 11 января 2010

for..in не предназначен для итерации массива. Он перебирает все свойства объекта, которые не являются встроенными. Поскольку MooTools добавил больше функций в прототип Array, теперь они также являются свойствами массива. Посмотреть это https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Statements/For...in

Просто используйте базовый цикл for для итерации массива.

...