我有一个JavaScript对象,如下所示:

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

我如何循环遍历p的所有元素(p1、p2、p3…)并获取它们的键和值?


当前回答

在ECMAScript 5中,在literal-Object.keys的迭代字段中有了新的方法

您可以在MDN上看到更多信息

我的选择如下,作为当前版本浏览器(Chrome30、IE10、FF25)中的更快解决方案

var keys = Object.keys(p),
    len = keys.length,
    i = 0,
    prop,
    value;
while (i < len) {
    prop = keys[i];
    value = p[prop];
    i += 1;
}

您可以将此方法的性能与jsperf.com上的不同实现进行比较:

扩展实施对象键迭代对象文字迭代

您可以在Kangax的兼容表上看到浏览器支持

对于旧浏览器,您有简单而完整的polyfill

UPD:

perfjs.info上此问题中所有最常见情况的性能比较:

对象文字迭代

其他回答

变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};for(p中的var键){if(p.hasOwnProperty(键)){console.log(key+“=”+p[key]);}}<p>输出:<br>p1=值1<br>p2=值2<br>p3=值3</p>

通过带有forEach()的原型,它应该跳过原型链财产:

Object.prototype.each = function(f) {
    var obj = this
    Object.keys(obj).forEach( function(key) { 
        f( key , obj[key] ) 
    });
}


//print all keys and values
var obj = {a:1,b:2,c:3}
obj.each(function(key,value) { console.log(key + " " + value) });
// a 1
// b 2
// c 3

在ECMAScript 5下,可以组合Object.keys()和Array.protocol.forEach():

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

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

ECMAScript 6添加了。。。第页,共页:

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)
);

你可以组合。。。of、destructuring和Object.entries:

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

Object.keys()和Object.entries()以与for相同的顺序迭代财产。。。但忽略原型链。只迭代对象自己的可枚举财产。

如果有人需要使用条件循环遍历arrayObjects:

var arrayObjects=〔{“building”:“A”,“status”:“good”},{“building”:“B”,“status”:“恐怖”}〕;for(var i=0;i<arrayObjects.length;i++){console.log(arrayObjects[i]);for(arrayObjects[i]中的键){if(key==“status”&&arrayObjects[i][key]==“good”){console.log(key+“->”+arrayObjects[i][key]);}其他{console.log(“未找到任何内容”);}}}

您可以像这样迭代:

for (var key in p) {
  alert(p[key]);
}

注意,键不会接受属性的值,它只是一个索引值。