我有一个JavaScript对象,如下所示:
var p = {
"p1": "value1",
"p2": "value2",
"p3": "value3"
};
我如何循环遍历p的所有元素(p1、p2、p3…)并获取它们的键和值?
我有一个JavaScript对象,如下所示:
var p = {
"p1": "value1",
"p2": "value2",
"p3": "value3"
};
我如何循环遍历p的所有元素(p1、p2、p3…)并获取它们的键和值?
当前回答
我在使用Angular时遇到了类似的问题,这里是我找到的解决方案。
步骤1。获取所有对象关键点。使用Object.keys。此方法返回给定对象自己的可枚举财产的数组。
步骤2。创建一个空数组。这是所有财产都将存在的地方,因为您的新ngFor循环将指向此数组,所以我们必须捕获所有属性。步骤3。迭代抛出所有键,并将每个键推入您创建的数组中。这是代码中的样子。
// Evil response in a variable. Here are all my vehicles.
let evilResponse = {
"car" :
{
"color" : "red",
"model" : "2013"
},
"motorcycle":
{
"color" : "red",
"model" : "2016"
},
"bicycle":
{
"color" : "red",
"model" : "2011"
}
}
// Step 1. Get all the object keys.
let evilResponseProps = Object.keys(evilResponse);
// Step 2. Create an empty array.
let goodResponse = [];
// Step 3. Iterate throw all keys.
for (prop of evilResponseProps) {
goodResponse.push(evilResponseProps[prop]);
}
这里是原始帖子的链接。https://medium.com/@papponmx/循环对象属性-带ngfor-in-angular-869cd7b2ddcc
其他回答
如果只想迭代财产,请使用上面的答案之一,但是如果要迭代包括函数在内的所有内容,则可能需要使用Object.getOwnPropertyNames(obj)
for(let o of Object.getOwnPropertyNames(数学)){console.log(o);}
我有时会用它来快速测试具有简单输入和输出的对象上的所有函数。
你可以使用我的库monadic对象来实现这一点。它的设计目的是简化对象修改并使其行为类似于数组:
p.forEach((key, value) => console.log(key, value))
安装:npm i一元对象
该库还包括以下方法:
地图滤器每一个一些
有关更多信息,请参阅README!
在ES6中,我们有众所周知的符号来公开一些以前的内部方法,您可以使用它来定义迭代器如何为这个对象工作:
var p = {
"p1": "value1",
"p2": "value2",
"p3": "value3",
*[Symbol.iterator]() {
yield *Object.keys(this);
}
};
[...p] //["p1", "p2", "p3"]
这将给出与用于…相同的结果。。。在es6循环中。
for(var key in p) {
console.log(key);
}
但了解您现在使用es6的能力很重要!
在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上此问题中所有最常见情况的性能比较:
对象文字迭代
for(key in p) {
alert( p[key] );
}
注意:可以对数组执行此操作,但也要对长度和其他财产进行迭代。