是否可以在不使用for循环的情况下迭代js对象的属性?

时间:2011-05-05 09:39:57

标签: javascript loops properties iteration

我正在尝试做这样的事情:

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 个答案:

答案 0 :(得分:1)

不是afaik。除了使用for..in循环时,关联数组没有内在顺序。如果你想要它有序,你可能想先取你的关联数组并将它映射到一个普通的索引数组,如这个

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

然后只是将当前索引存储到此数组中的情况。

答案 1 :(得分:1)

我发现您无法使用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;
}

答案 2 :(得分:0)

您可以在一开始就构建数组,然后将其包装在一个函数中,以便一次剥离一个元素。或许有点像这样:

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.
}

答案 3 :(得分:-2)

您可以使用如下循环遍历JS对象中的所有属性:

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

您需要循环AFAIK才能获得第一个密钥。所以是的,你需要这样做并立即爆发。