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

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

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


当前回答

如果我们不提循环对象的其他方法,这个问题就不完整了。

如今,许多知名的JavaScript库提供了自己的方法来迭代集合,即在数组、对象和类数组对象上迭代。这些方法使用方便,与任何浏览器都完全兼容。

如果使用jQuery,可以使用jQuery.each()方法。它可以用于对对象和数组进行无缝迭代:$.each(obj,函数(键,值){console.log(键,值);});在Undercore.js中,您可以找到方法_.each(),它遍历一个元素列表,依次生成一个提供的函数(注意iterate函数中参数的顺序!):_.each(obj,函数(值,键){console.log(键,值);});Lo-Dash提供了几种迭代对象财产的方法。Basic _.forEach()(或其别名_.each())对于循环遍历对象和数组非常有用,但是(!)具有长度属性的对象被视为数组,为了避免这种行为,建议使用_.forIn()和_.forOwn()方法(这些方法也有值参数):_.forIn(obj,函数(值,键){console.log(键,值);});_.forIn()迭代对象的自身和继承的可枚举财产,而_.forOwn()只迭代对象的自己的财产(基本上是检查hasOwnProperty函数)。对于简单对象和对象文本,这些方法中的任何一种都可以正常工作。

通常,所有描述的方法都具有与任何提供的对象相同的行为。除了将本机用于。。in循环通常比任何抽象(如jQuery.each())都快,这些方法使用起来非常容易,需要更少的编码,并提供更好的错误处理。

其他回答

我会这样做,而不是在每个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");
}

我在使用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

变量p={“p1”:“值1”,“p2”:“值2”,“p3”:“值3”};var myMap=新地图(Object.entries(p));for(let[k,v]of myMap.entries()){console.log(`${k}:${v}`)}<h3>ECMAScript 2017年</h3><p><b>Object.entries()</b>使将<b>对象转换为映射</b>变得简单:</p>

当对象实现.next()方法时,它将成为迭代器

常量james={name:“James”,高度:`5'10“`,重量:185,[符号迭代器](){让财产=[]for(let key of Object.keys(james)){财产推送(键);}索引=0;返回{下一个:()=>{let键=财产[索引];let value=this[key];让done=索引>=属性.length-1;索引++;返回{钥匙价值完成};}};}};constiterator=james[Symbol.iiterator]();console.log(迭代器.next().value);//'詹姆斯console.log(迭代器.next().value);//`5'10`console.log(迭代器.next().value);//185

for(key in p) {
  alert( p[key] );
}

注意:可以对数组执行此操作,但也要对长度和其他财产进行迭代。