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

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

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


当前回答

如果只想迭代财产,请使用上面的答案之一,但是如果要迭代包括函数在内的所有内容,则可能需要使用Object.getOwnPropertyNames(obj)

for(let o of Object.getOwnPropertyNames(数学)){console.log(o);}

我有时会用它来快速测试具有简单输入和输出的对象上的所有函数。

其他回答

方法返回给定对象自己的可枚举财产的数组。在此处阅读更多信息

变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};Object.keys(p).map((key)=>console.log(key+“->”+p[key]))

我会这样做,而不是在每个for…中检查obj.hasOwnerProperty。。。在循环中。

var obj = {a : 1};
for(var key in obj){
    //obj.hasOwnProperty(key) is not needed.
    console.log(key);
}
//then check if anybody has messed the native object. Put this code at the end of the page.
for(var key in Object){
    throw new Error("Please don't extend the native object");
}

有两个选项:

您可以使用。。在那里

变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};for(p中的常量项){console.log(`key=${item},value=${p[item]}`);}

您还可以调用Object.entries()来创建一个包含所有可枚举财产的数组。之后,您可以使用map、foreach或for循环浏览它。。属于

变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};Object.entries(p).map(item=>{console.log(项)})

变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};Object.entries(p).forEach(item=>{console.log(项)})

变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};for(Object.entries(p)的常量项){console.log(项)}

有关Object.entries()的更多信息,请参见此处

您还可以使用Object.keys(),并按如下方式迭代对象键以获取值:

变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};Object.keys(p).forEach((key)=>{console.log(键+'->'+p[key]);});

在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上此问题中所有最常见情况的性能比较:

对象文字迭代