我有一个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.getOwnPropertyNames(obj)
for(let o of Object.getOwnPropertyNames(数学)){console.log(o);}
我有时会用它来快速测试具有简单输入和输出的对象上的所有函数。
其他回答
由于es2015越来越流行,我发布了这个答案,其中包括使用生成器和迭代器平滑地遍历[key,value]对。这在其他语言中是可能的,例如Ruby。
好的,这里有一个代码:
常量MyObject={“a”:“您好”,'b':'它',“c”:“我”,“d”:“你”,“e”:“正在查找”,“f”:“for”,[Symbol.iiterat]:函数*(){for(Object.keys(this)的常量i){产量[i,this[i];}}};for(MyObject的常量[k,v]){console.log(`这里是键${k},这里是值${v}`);}
关于如何使用迭代器和生成器的所有信息,您可以在开发者Mozilla页面上找到。
希望它帮助了某人。
编辑:
ES2017将包含Object.entries,这将使对象中的[key,value]对的迭代更加容易。现在已知,根据ts39阶段信息,它将成为标准的一部分。
我认为是时候更新我的答案了,让它变得比现在更新鲜。
常量MyObject={“a”:“您好”,'b':'它',“c”:“我”,“d”:“你”,“e”:“正在查找”,“f”:“for”,};for(Object.entries(MyObject)的常量[k,v]){console.log(`这里是键${k},这里是值${v}`);}
您可以在上找到有关用法的更多信息MDN页面
将对象传递给object.keys()。这将返回一个包含对象中所有键的数组。然后可以使用map循环遍历数组。使用obj[key],其中obj是对象,key是映射迭代中的当前值,可以获得该键/属性的值。
const obj = { name: "Jane", age: 50 };
Object.keys(obj).map( key => {
console.log(key, obj[key]);
});
如果我们不提循环对象的其他方法,这个问题就不完整了。
如今,许多知名的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())都快,这些方法使用起来非常容易,需要更少的编码,并提供更好的错误处理。
使用纯JavaScript时,循环可能非常有趣。似乎只有ECMA6(新的2015 JavaScript规范)控制了循环。不幸的是,在我写这篇文章的时候,浏览器和流行的集成开发环境(IDE)仍然在努力完全支持这些新功能。
在ECMA6之前,JavaScript对象循环是什么样子的
for (var key in object) {
if (p.hasOwnProperty(key)) {
var value = object[key];
console.log(key); // This is the key;
console.log(value); // This is the value;
}
}
此外,我知道这超出了这个问题的范围,但在2011年,ECMAScript 5.1仅为数组添加了forEach方法,这基本上创建了一种新的改进方法来循环遍历数组,同时仍保留不可迭代的对象与旧的冗长和混乱的for循环。但奇怪的是,这种新的forEach方法不支持导致其他各种问题的break。
基本上在2011年,除了许多流行的库(jQuery、Undercore等)决定重新实现之外,没有一种真正可靠的JavaScript循环方法。
截至2015年,我们现在有了一种更好的开箱即用的方式来循环(和中断)任何对象类型(包括数组和字符串)。以下是当推荐成为主流时,JavaScript中的循环最终会是什么样子:
for (let [key, value] of Object.entries(object)) {
console.log(key); // This is the key;
console.log(value); // This is the value;
}
注意,截至2016年6月18日,大多数浏览器都不支持上述代码。即使在Chrome中,您也需要启用此特殊标志才能工作:chrome://flags/#enable-javascript和谐
在这成为新标准之前,旧方法仍然可以使用,但在流行的库中也有替代方法,甚至对于那些不使用这些库的人来说,也有轻量级的替代方法。
如果有人需要使用条件循环遍历arrayObjects:
var arrayObjects=〔{“building”:“A”,“status”:“good”},{“building”:“B”,“status”:“恐怖”}〕;for(var i=0;i<arrayObjects.length;i++){console.log(arrayObjects[i]);for(arrayObjects[i]中的键){if(key==“status”&&arrayObjects[i][key]==“good”){console.log(key+“->”+arrayObjects[i][key]);}其他{console.log(“未找到任何内容”);}}}