如何在Javascript中循环遍历键/值对象?

161
var user = {};

现在我想创建一个setUsers()方法,该方法接受一个键/值对对象并初始化user变量。

setUsers = function(data) {     
   // loop and init user    
}

数据格式如下:

234: "john", 23421: "smith", ....

12
如何从一个较新的问题中复制一个较旧的问题? - Paulo Coghi
3
@PauloCoghi 看起来版主们喝醉了,算了吧... - Fusseldieb
2
他们选择了得票更多的那个。它写得也更好一些,而且答案更多、得票更高。保留那一个比这一个更有意义。 - Inigo
数据模型是对象列表 {{},..} 中的对象。什么情况下我会使用它,而不是对象数组 [{},..]?好的,在这里有答案,欢迎来到 SO ;)。 - Timo
3个回答

221

要小心从对象的原型继承的属性(如果你在页面中包含任何库,比如旧版本的Prototype,这种情况可能会发生)。您可以通过使用对象的hasOwnProperty()方法进行检查。在使用for...in循环时,这通常是一个好主意:

var user = {};

function setUsers(data) {
    for (var k in data) {
        if (data.hasOwnProperty(k)) {
           user[k] = data[k];
        }
    }
}

3
有没有不用for in循环的方法来实现这个?我担心在大型键值对中的速度问题(我知道Crockford不喜欢使用JSLint,但我不确定他的理由)。有必要担心这些问题吗? - streetlight
2
@streetlight:这取决于环境。如果您可以依赖ECMAScript 5(所有现代浏览器都支持,Node.js也是如此),则可以使用Object.keys()等选项。例如,如果您需要支持IE <= 8,则只能使用for...in - Tim Down

104
for (var key in data) {
    alert("User " + data[key] + " is #" + key); // "User john is #234"
}

16

类似这样:

setUsers = function (data) {
    for (k in data) {
        user[k] = data[k];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接