我有对象在JavaScript:
var object = someobject;
Object { aaa=true, bbb=true, ccc=true }
如何使用每个为这个?
object.each(function(index, value)) {
console.log(value);
}
不工作。
我有对象在JavaScript:
var object = someobject;
Object { aaa=true, bbb=true, ccc=true }
如何使用每个为这个?
object.each(function(index, value)) {
console.log(value);
}
不工作。
javascript对象没有标准的.each功能。 jQuery提供了一个函数。见http://api.jquery.com/jQuery.each/下面应该工作
$.each(object, function(index, value) {
console.log(value);
});
另一种选择是使用香草的Javascript使用Object.keys()
和数组这样
Object.keys(object).map(function(objectKey, index) {
var value = object[objectKey];
console.log(value);
});
.map()
功能见https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Object/keys和https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
这些通常是更好比使用一个vanilla Javascript for-loop,除非你真的理解使用正常for循环的含义并且看它的具体用途像循环过财产链一样的特征。
但是通常,for-loop的效果并不比jQuery
或Object.keys().map()
好。我将在下面使用普通的for-loop来解决两个潜在的问题。
权,因此也在其他的答案中指出,一个普通的JavaScript替代办法是
for(var index in object) {
var attr = object[index];
}
没有与此两个潜在的问题:
1。你想检查你发现的属性是否来自对象本身,而不是来自原型链。这可以通过hasOwnProperty
功能进行检查,像这样
for(var index in object) {
if (object.hasOwnProperty(index)) {
var attr = object[index];
}
}
jQuery.each
和Object.keys
函数会自动处理它。
2。简单for循环的另一个潜在问题是范围和非闭包。这有点复杂,但以下面的代码为例。我们有一堆与IDS BUTTON0,按钮1,按钮2等按钮,我们要对其设置一个onclick,做一个console.log
这样的:
<button id='button0'>click</button>
<button id='button1'>click</button>
<button id='button2'>click</button>
var messagesByButtonId = {"button0" : "clicked first!", "button1" : "clicked middle!", "button2" : "clicked last!"];
for(var buttonId in messagesByButtonId) {
if (messagesByButtonId.hasOwnProperty(buttonId)) {
$('#'+buttonId).click(function() {
var message = messagesByButtonId[buttonId];
console.log(message);
});
}
}
如果,一段时间后,我们点击任何按钮我们将永远得到“最后点击!”在控制台中,并且从不“先点击!”或“点击中间!”。为什么?因为在执行onclick函数时,它会在时刻使用buttonId
变量显示messagesByButtonId[buttonId]
。并且由于该循环在那一刻完成,所以buttonId
变量仍然是“button2”(它在上次循环迭代期间的值),因此messagesByButtonId[buttonId]
将是messagesByButtonId["button2"]
,即“最后点击!”。
有关闭包的更多信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures。尤其是该页面涵盖我们示例的最后一部分。
再次,jQuery.each
和Object.keys().map()
自动解决这个问题对我们来说,因为它为我们提供了function(index, value)
(具有封闭),所以我们是安全的,同时使用索引和值和放心,他们有我们所期望的价值。
for(var key in object) {
console.log(object[key]);
}
谢谢,但这个回报我”真实“,而不是aaa,bbb,ccc :( – 2012-08-07 13:19:47
是啊多数民众赞成在什么它的priting安慰属性的价值是真实的每个键,如果你想看到aaa,bbb,ccc然后使用'console.log(key);' – 2012-08-07 17:34:55
请注意,您可能想要检查找到的密钥是来自对象本身,还是来自原型链。使用object.hasOwnProperty(key)检查 – 2013-10-03 11:26:32
var object = { "a": 1, "b": 2};
$.each(object, function(key, value){
console.log(key + ": " + object[key]);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
//output
a: 1
b: 2
这是错误的! $ .each是JQuery-Framework! – raiserle 2014-04-14 11:44:55
这取决于jquery。有没有jQuery解决方案? – 2014-07-29 21:17:29
你应该添加一些标题给你的答案,说明它是jQuery依赖的 – davidtaubmann 2017-04-07 14:40:26
http://stackoverflow.com/questions/921789/how-to-loop-through-javascript-object-literal-with-objects-as-成员 – 2012-08-07 12:55:39
你使用jQuery吗?你期望什么结果?控制台中有三个“真”吗? – davids 2012-08-07 12:56:24
jQuery的$ .each文档(http://api.jquery.com/jQuery.each/)有一个完美的例子 - 请参阅页面上的第二个代码块。使用alert()而不是console.log()。 – Faust 2012-08-07 13:00:24