Можно ли перебирать свойства объекта js без использования цикла for? - PullRequest
1 голос
/ 05 мая 2011

Я пытаюсь сделать что-то вроде этого:

var myObject={'key1':value1, 'key2': value2, /*etc*/}; // big object created by an ajax call
var key=myObject.getFirstKey(); // something that does this. Maybe an immediately breaking for in loop.

function handleOne()
{
   var obj=myObject[key];
   // do something...
   key=myObject.getNextKey(); // something that does this.
   if (key===null) clearInterval(interval);
}

var interval=setInterval(handleOne,1000);

Afaik, единственный способ перебрать объект js - это цикл for..in.Каждый раз, когда я пытался сделать что-то подобное, мне нужно было поместить все свойства в массив.

Мне просто интересно, можно ли получить следующий ключ из предыдущего, не связываясь с массивом?

(Этот скрипт является частью пользовательского скрипта graeasemonkey, поэтому я не возражаю, если решение только для Firefox.)

Ответы [ 4 ]

1 голос
/ 05 мая 2011

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

var myMappedArray = [ { key = "Key1", value = value1 }, { key = "Key2", value = value2 }, ... ];

. Тогда это просто случай сохранения текущего индекса в этом массиве.

1 голос
/ 05 мая 2011

Я вижу причину, по которой вы не можете использовать цикл for .. in, это вызов setInterval, который делает вашу логику асинхронной, и for .. in должен выполняться только синхронно

Можно получить все ключи, связанные собъект, использующий Object.keys стандартный метод (не поддерживается в IE6-8), а затем выполнить итерацию с оператором for:

var keys = Object.keys(myObject),
    i = 0;
function go() {
    var value = myObject[keys[i]];
    // handle value
    i++;
    if (i < keys.length) {
        setTimeout(go, 200);
    }
}
go();

, а для IE6-8 просто определите функцию keys самостоятельно:

!Object.keys && Object.keys = function(o) {
    var keys = [];
    for (var key in o) {
        keys.push(key);
    }
    return keys;
}
0 голосов
/ 05 мая 2011

Вы можете создать массив с самого начала, а затем обернуть его в функцию, чтобы отделить один элемент за раз. Возможно, что-то вроде этого:

function build_iterator(obj) {
    var keys = [ ];
    for(var k in obj)
        if(obj.hasOwnProperty(k))
            keys.push(k);
    return function() {
        return keys.pop();
    };
}

var get_next_key = build_iterator(my_object);

var interval = setInterval(handle_one, 1000);

function handle_one() {
    var key = get_next_key();
    if(key === null) {
        clearInterval(interval);
        return;
    }
    var obj = my_object[key];
    // Do something fantastic.
}
0 голосов
/ 05 мая 2011

Вы можете перебирать все свойства объекта JS, используя цикл, подобный следующему:

for(var propertyName in myObject) {
   myObject[propertyName];
}

Вам понадобится цикл AFAIK, чтобы получить свой первый ключ.Так что да, вам нужно сделать это и немедленно вырваться.

...