我有一个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…)并获取它们的键和值?
当前回答
这是如何循环javascript对象并将数据放入表中的。<body><脚本>函数createTable(objectArray,fields,fieldTitles){let body=document.getElementsByTagName('body')[0];let tbl=document.createElement('table');let thead=document.createElement('head');let thr=document.createElement('tr');for(objectArray[0]中的p){let th=document.createElement('th');th.appendChild(document.createTextNode(p));thr.appendChild(th);}thead.appendChild(thr);tbl.appendChild(thead);let tbdy=document.createElement('tbody');let tr=document.createElement('tr');objectArray.forEach((对象)=>{设n=0;let tr=document.createElement('tr');for(objectArray[0]中的p){var td=document.createElement('td');td.appendChild(document.createTextNode(object[p]));tr.appendChild(td);n++;};tbdy.appendChild(tr);});tbl.appendChild(tbdy);body.appendChild(待定)返回tbl;}创建表格([{name:“香蕉”,价格:“3.04”},//k[0]{name:“Orange”,价格:“2.56”},//k[1]{name:“苹果”,价格:“1.45”}])</script>
其他回答
您还可以使用Object.keys(),并按如下方式迭代对象键以获取值:
变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};Object.keys(p).forEach((key)=>{console.log(键+'->'+p[key]);});
在javascript中迭代对象的多种方法
正在使用。。。在回路中
变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};for(输入p){if(p.hasOwnProperty(键)){console.log(`${key}:${p[key]}`)}}
正在使用。。。回路的
变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};for(对象.keys(p)的let键){console.log(`key:${key}&value:${p[key]}`)}
将forEach()与Object.keys、Object.values、Object.entries一起使用
变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};Object.keys(p).forEach(key=>{console.log(`${key}:${p[key]}`);});对象.values(p).forEach(值=>{console.log(值);});Object.entries(p).forEach(([key,value])=>{console.log(`${key}:${value}`)})
前言:
对象财产可以是自己的(属性在对象本身上),也可以是继承的(不在对象本身或其原型上)。对象财产可以是可枚举的或非可枚举的。在许多属性枚举/数组中,不包含非数财产。属性名称可以是字符串或符号。许多属性枚举/数组都没有包含名称为Symbol的财产。
2018年,您可以选择循环访问对象的财产(以下是一些示例):
for-in[MDN,spec]-一种循环结构,循环遍历对象的可枚举财产的名称,包括名称为字符串的继承属性keys[MDN,spec]-一个函数,提供对象自己的可枚举财产的名称数组,这些属性的名称是字符串。Object.values[MDN,spec]-提供对象自身可枚举财产值数组的函数。Object.entries[MDN,spec]-提供对象自身可枚举财产的名称和值数组的函数(数组中的每个条目都是[name,value]数组)。Object.getOwnPropertyNames[MDN,spec]-一个函数,提供对象自己的财产(即使是不可枚举的属性)的名称数组,这些属性的名称是字符串。Object.getOwnPropertySymbols[MDN,spec]-一个函数,提供对象自己的财产(即使是不可枚举的属性)的名称数组,其名称为Symbols。Reflect.ownKeys[MDN,spec]-一个函数,提供对象自己的财产(即使是非枚举属性)的名称数组,无论这些名称是字符串还是符号。如果需要对象的所有财产,包括非枚举继承的属性,则需要使用循环和object.getPrototypeOf[MDN,spec],并在原型链中的每个对象上使用object.getOwnPropertyNames、object.getOwnPropertySymbols或Reflect.ownKeys(此答案底部的示例)。
对于除in之外的所有元素,您将在数组上使用某种循环构造(for、for、forEach等)。
示例:
中的:
//要从中继承的原型对象,具有名为property的字符串常量p={answer:42};//我们将看到的对象继承自`p`const o=对象创建(p);//名为property的字符串o.question=“生命、宇宙和一切”;//名为属性的符号o[Symbol(“author”)]=“Douglas Adams”;for(o中的常量名称){常量值=o[名称];console.log(`${name}=${value}`);}
Object.keys(带有for of循环,但可以使用任何循环构造):
//要从中继承的原型对象,具有名为property的字符串常量p={answer:42};//我们将看到的对象继承自`p`const o=对象创建(p);//名为property的字符串o.question=“生命、宇宙和一切”;//名为属性的符号o[Symbol(“author”)]=“Douglas Adams”;for(Object.keys(o)的常量名称){常量值=o[名称];console.log(`${name}=${value}`);}
对象值:
//要从中继承的原型对象,具有名为property的字符串常量p={answer:42};//我们将看到的对象继承自`p`const o=对象创建(p);//名为property的字符串o.question=“生命、宇宙和一切”;//名为属性的符号o[Symbol(“author”)]=“Douglas Adams”;for(Object.values(o)的常量值){console.log(`${value}`);}
对象条目:
//要从中继承的原型对象,具有名为property的字符串常量p={answer:42};//我们将看到的对象继承自`p`const o=对象创建(p);//名为property的字符串o.question=“生命、宇宙和一切”;//名为属性的符号o[Symbol(“author”)]=“Douglas Adams”;for(Object.entries(o)的常量[名称,值]){console.log(`${name}=${value}`);}
Object.getOwnPropertyName:
//要从中继承的原型对象,具有名为property的字符串常量p={answer:42};//我们将看到的对象继承自`p`const o=对象创建(p);//名为property的字符串o.question=“生命、宇宙和一切”;//名为属性的符号o[Symbol(“author”)]=“Douglas Adams”;for(Object.getOwnPropertyNames(o)的常量名称){常量值=o[名称];console.log(`${name}=${value}`);}
Object.getOwnPropertySymbols:
//要从中继承的原型对象,具有名为property的字符串常量p={answer:42};//我们将看到的对象继承自`p`const o=对象创建(p);//名为property的字符串o.question=“生命、宇宙和一切”;//名为属性的符号o[Symbol(“author”)]=“Douglas Adams”;for(Object.getOwnPropertySymbol(o)的常量名称){常量值=o[名称];console.log(`${String(name)}=${value}`);}
反射所有键:
//要从中继承的原型对象,具有名为property的字符串常量p={answer:42};//我们将看到的对象继承自`p`const o=对象创建(p);//名为property的字符串o.question=“生命、宇宙和一切”;//名为属性的符号o[Symbol(“author”)]=“Douglas Adams”;for(Reflect.ownKeys(o)的常量名称){常量值=o[名称];console.log(`${String(name)}=${value}`);}
所有财产,包括继承的非枚举属性:
//要从中继承的原型对象,具有名为property的字符串常量p={answer:42};//我们将看到的对象继承自`p`const o=对象创建(p);//名为property的字符串o.question=“生命、宇宙和一切”;//名为属性的符号o[Symbol(“author”)]=“Douglas Adams”;for(让深度=0,当前=o;当前;++深度,当前=Object.getPrototypeOf(当前)){for(Reflect.ownKeys(当前)的常量名称){常量值=o[名称];console.log(`[${depth}]${String(name)}=${字符串(value)}`);}}.作为控制台包装{最大高度:100%!重要的}
正在使用。。。in和Object hasOwnProperty变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};for(p中的var键){if(p.hasOwnProperty(键)){console.log(key,':',p[key]);}}正在使用。。。的和对象键变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};for(Object.keys(p)的var键){console.log(键,“:”,p[key])}使用Object键和forEach变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};Object.keys(p).forEach(函数(键){console.log(key,':',p[key]);});正在使用。。。的和对象条目变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};for(let[key,value]of Object.entries(p)){console.log(键,“:”,值);}使用Object条目和forEach变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};Object.entries(p).forEach(([key,value])=>console.log(key,':',value));
在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上此问题中所有最常见情况的性能比较:
对象文字迭代