开发者问题收集

如何循环或枚举 JavaScript 对象?

2009-03-26
2819011

我有一个如下的 JavaScript 对象:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

如何循环遍历 p 的所有元素 ( p1p2p3 ...) 并获取它们的键和值?

3个回答

您可以使用 for-in 循环,如其他人所示。但是,您还必须确保获取的键是对象的实际属性,而不是来自原型。

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

for (var key in p) {
    if (p.hasOwnProperty(key)) {
        console.log(key + " -> " + p[key]);
    }
}

使用 Object.keys() 替代 For-of:

var p = {
    0: "value1",
    "b": "value2",
    key: "value3"
};

for (var key of Object.keys(p)) {
    console.log(key + " -> " + p[key])
}

请注意使用 for-of 而不是 for-in ,如果不使用,它将在命名属性上返回未定义,并且 Object.keys() 确保仅使用对象自己的属性,而无需使用整个原型链属性

使用新的 Object.entries() 方法:

注意: Internet Explorer 本身不支持此方法。您可以考虑为旧版浏览器使用 Polyfill。

const p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

for (const [key, value] of Object.entries(p)) {
  console.log(`${key}: ${value}`);
}
levik
2009-03-26

在 ECMAScript 5 下,你可以结合使用 Object.keys() Array.prototype.forEach() :

var obj = { first: "John", last: "Doe" };

Object.keys(obj).forEach(function(key) {
    console.log(key, obj[key]);
});

ECMAScript 6 添加了 for...of :

for (const key of Object.keys(obj)) {
    console.log(key, obj[key]);
}

ECMAScript 8 添加了 Object.entries() ,这样就不必查找原始对象中的每个值:

Object.entries(obj).forEach(
    ([key, value]) => console.log(key, value)
);

您可以组合使用 for...of 、解构和 Object.entries :

for (const [key, value] of Object.entries(obj)) {
    console.log(key, value);
}

Object.keys()Object.entries() 都以与 for...in 循环相同的顺序迭代属性, 但忽略原型链 。仅迭代对象自身的可枚举属性。

Axel Rauschmayer
2011-04-20

您必须使用 for-in 循环

但是使用这种循环时要非常小心,因为这将 循环原型链上的所有属性

因此,在使用 for-in 循环时,请始终使用 hasOwnProperty 方法来确定迭代中的当前属性是否确实是您正在检查的对象的属性:

for (var prop in p) {
    if (!p.hasOwnProperty(prop)) {
        //The current property is not a direct property of p
        continue;
    }
    //Do your logic with the property here
}
Andreas Grech
2009-03-26