我有一个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…)并获取它们的键和值?
当前回答
Object.keys(obj):数组检索所有可枚举自身(非继承)财产的所有字符串值键。
因此,通过使用hasOwnProperty测试每个对象键,它提供了与您想要的相同的键列表。您不需要额外的测试操作,因为Object.keys(obj).forEach(function(key){})应该更快。让我们来证明一下:
var uniqid=函数(){var text=“”,i=0,可能=“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvxyz”;对于(;i<32;i++){text+=可能的charAt(数学地板(数学随机()*可能的长度));}返回文本;}, 周期=100000,obj={},p1,p2,p3,钥匙//使用随机财产填充对象Array.apply(null,Array(CYCLES)).forEach(function(){obj[uniqid()]=新日期()});//方法#1p1=performance.now();Object.keys(obj).forEach(函数(键){var waste=obj[key];});p2=performance.now();console.log(“Object.keys方法耗时”+(p2-p1)+“毫秒”);//方法#2for(在obj中键入){if(obj.hasOwnProperty(键)){var waste=obj[key];}}p3=performance.now();console.log(“for…in/hasOwnProperty方法花费了”+(p3-p2)+“毫秒”);
在我的Firefox中,我有以下结果
Object.keys方法耗时40.21101451665163毫秒。对于in/hasOwnProperty方法耗时98.26163508463651毫秒。
在Chrome上,差异更大http://codepen.io/dsheiko/pen/JdrqXa
PS2:在ES6(EcmaScript 2015)中,您可以更好地迭代可迭代对象:
let map=new map().set('a',1).set('b',2);for(let对映射){console.log(对);}//或let map=新地图([[错误,'否'],[真,'是'],]);map.forEach((value,key)=>{console.log(键,值);});
其他回答
您可以使用for in循环,如其他人所示。然而,您还必须确保获得的密钥是对象的实际属性,而不是来自原型。
下面是片段:变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};for(p中的var键){if(p.hasOwnProperty(键)){console.log(键+“->”+p[key]);}}
对于具有Object.keys()选项的:
变量p={0:“值1”,“b”:“值2”,键:“value3”};for(Object.keys(p)的var键){console.log(key+“->”+p[key])}
请注意for-of而不是for-in的用法,如果不使用,它将在命名的财产上返回undefined,并且Object.keys()确保只使用对象自己的财产,而不使用整个prototype-chain财产
使用新的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}`);
}
方法返回给定对象自己的可枚举财产的数组。在此处阅读更多信息
变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};Object.keys(p).map((key)=>console.log(key+“->”+p[key]))
如果只想迭代财产,请使用上面的答案之一,但是如果要迭代包括函数在内的所有内容,则可能需要使用Object.getOwnPropertyNames(obj)
for(let o of Object.getOwnPropertyNames(数学)){console.log(o);}
我有时会用它来快速测试具有简单输入和输出的对象上的所有函数。
如果还想迭代非可枚举财产,可以使用Object.getOwnPropertyNames(obj)返回直接在给定对象上找到的所有财产(可枚举或不可枚举)的数组。
var obj=对象.创建({}{//不可枚举属性获取食物:{value:函数(){return this.foo;},可枚举:false}});obj.foo=1;//可枚举属性Object.getOwnPropertyNames(obj).forEach(函数(名称){document.write(name+':'+obj[name]+'<br/>');});
您可以向所有对象添加一个简单的forEach函数,这样就可以自动循环任何对象:
Object.defineProperty(Object.prototype, 'forEach', {
value: function (func) {
for (var key in this) {
if (!this.hasOwnProperty(key)) {
// skip loop if the property is from prototype
continue;
}
var value = this[key];
func(key, value);
}
},
enumerable: false
});
对于那些不喜欢“For…in”方法的人:
Object.defineProperty(Object.prototype, 'forEach', {
value: function (func) {
var arr = Object.keys(this);
for (var i = 0; i < arr.length; i++) {
var key = arr[i];
func(key, this[key]);
}
},
enumerable: false
});
现在,您可以简单地调用:
p.forEach (function(key, value){
console.log ("Key: " + key);
console.log ("Value: " + value);
});
如果您不想与其他forEach方法发生冲突,可以使用您的唯一名称命名它。