如何循环或枚举 JavaScript 对象?
我有一个如下的 JavaScript 对象:
var p = {
"p1": "value1",
"p2": "value2",
"p3": "value3"
};
如何循环遍历
p
的所有元素 (
p1
、
p2
、
p3
...) 并获取它们的键和值?
您可以使用
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}`);
}
在 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
循环相同的顺序迭代属性,
但忽略原型链
。仅迭代对象自身的可枚举属性。
您必须使用 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
}