我有一个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…)并获取它们的键和值?
当前回答
您必须使用for in循环
但在使用这种循环时要非常小心,因为这将沿着原型链循环所有财产。
因此,在循环中使用for时,请始终使用hasOwnProperty方法来确定迭代中的当前属性是否真的是要检查的对象的属性:
for (var prop in p) {
if (!p.hasOwnProperty(prop)) {
//The current property is not a direct property of p
continue;
}
//Do your logic with the property here
}
其他回答
在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}`)})
如果还想迭代非可枚举财产,可以使用Object.getOwnPropertyNames(obj)返回直接在给定对象上找到的所有财产(可枚举或不可枚举)的数组。
var obj=对象.创建({}{//不可枚举属性获取食物:{value:函数(){return this.foo;},可枚举:false}});obj.foo=1;//可枚举属性Object.getOwnPropertyNames(obj).forEach(函数(名称){document.write(name+':'+obj[name]+'<br/>');});
考虑到ES6,我想添加自己的一勺糖,并提供另一种方法来迭代对象的财产。
由于纯JS对象不能立即迭代,因此我们无法使用。。用于迭代其内容的循环。但没有人能阻止我们使其可迭代。
让我们有书的对象。
let book = {
title: "Amazing book",
author: "Me",
pages: 3
}
book[Symbol.iterator] = function(){
let properties = Object.keys(this); // returns an array with property names
let counter = 0;
let isDone = false;
let next = () => {
if(counter >= properties.length){
isDone = true;
}
return { done: isDone, value: this[properties[counter++]] }
}
return { next };
}
既然我们做到了,我们可以这样使用它:
for(let pValue of book){
console.log(pValue);
}
------------------------
Amazing book
Me
3
或者如果你知道ES6发电机的功率,那么你当然可以让上面的代码更短。
book[Symbol.iterator] = function *(){
let properties = Object.keys(this);
for (let p of properties){
yield this[p];
}
}
当然,通过在原型级别上使Object可迭代,您可以对所有对象应用这样的行为。
Object.prototype[Symbol.iterator] = function() {...}
此外,符合可迭代协议的对象可以与新的ES2015特性扩展运算符一起使用,因此我们可以将对象属性值作为数组读取。
let pValues = [...book];
console.log(pValues);
-------------------------
["Amazing book", "Me", 3]
或者可以使用析构函数赋值:
let [title, , pages] = book; // notice that we can just skip unnecessary values
console.log(title);
console.log(pages);
------------------
Amazing book
3
您可以使用我上面提供的所有代码查看JSFiddle。
由于ES06,您可以使用
let arrValues = Object.values( yourObject) ;
它返回一个对象值数组,而不从Prototype中提取值!!
MDN DOCS对象.values()
还有钥匙(在我面前准备好了)
let arrKeys = Object.keys(yourObject);
这是如何循环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>