Javascript:使用不规则键遍历对象内的所有记录

时间:2012-12-31 07:53:26

标签: javascript arrays

已更新

我有一个对象var myObject = {};

我使用像这样的密钥构建它:

myObject[key] = {
   name: ...
};

想象一下,我创造了三条记录:

myObject[13] = {...};
myObject[281] = {...};
myObject[76] = {...};

我现在想要遍历对象,就像它是一个数组一样。

var i,
    length = myObject.length;     // ?? Problem here 'cos it ain't an array

for (i = 0; i < length; i += 1) {
    ????
};

如何在????处参考三个元素?我不知道数字13,281&amp; 76,myObject[0]不会找到第一条记录。

感谢。

2 个答案:

答案 0 :(得分:5)

如果您的密钥不连续,则不应使用数组。改为使用对象:

var myObject = {};

要循环对象的键,可以使用for..in语法:

for (var key in myObject) {
    var value = myObject[key];
}

要使当前代码正常工作,您必须遍历所有密钥,并检查它们是否具有值:

for (var i = 0; i < myArray.length; i++) {
    var value = myArray[i];

    if (typeof value === 'undefined') continue;

    console.log(key, ' -> ', value)
}

答案 1 :(得分:-1)

如果您使用的是现代JavaScript引擎:

myArray.forEach(function(val, key) {
    // val = the value
    // key = the index
});

就是这样。获得它的大小(在这种情况下为3)......

var size = myArray.reduce(function(prev) {
    return ++prev;
}, 0);

如果您希望在旧版浏览器中使用此功能,则需要执行其他操作。最简单的解决方案可能是自己实现这样的东西:

for (var i = 0; i < myArray.length; i ++) {
    var val = myArray[i];
    if (typeof val !== "undefined") {
        console.log(val);
    }
}

要获得它的大小,这是一个类似的努力(如果你同时做两件事,你可以结合上面的方法):

var size = 0;
for (var i = 0; i < myArray.length; i ++) {
    if (typeof myArray[i] !== "undefined")
        size ++;
}

如果你想像上面那样使用forEachreduce,你需要找到一个垫片(基本上,你需要自己实现这些功能)。我建议使用larger of the two forEach shims on this pagethe reduce shim on this page,或使用a library that shims them all