每个对象?

Tom*_*ert 120 javascript jquery

可能重复:
迭代对象文字值

我在JavaScript中有对象:

var object = someobject;

Object { aaa=true, bbb=true, ccc=true }
Run Code Online (Sandbox Code Playgroud)

我怎么能用它呢?

 object.each(function(index, value)) {
      console.log(value);
 }
Run Code Online (Sandbox Code Playgroud)

不工作.

Wil*_*der 307

javascript对象没有标准的.each函数.jQuery提供了一个功能.请参阅http://api.jquery.com/jQuery.each/以下内容应该有效

$.each(object, function(index, value) {
    console.log(value);
}); 
Run Code Online (Sandbox Code Playgroud)

另一个选择是使用类似于此Object.keys()的Array .map()函数使用vanilla Javascript

Object.keys(object).map(function(objectKey, index) {
    var value = object[objectKey];
    console.log(value);
});
Run Code Online (Sandbox Code Playgroud)

请参阅https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Object/keyshttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /阵列/地图

这些通常比使用vanilla Javascript for循环要好,除非您真正理解使用普通for循环的含义并查看使用它的特定特性,如循环遍历属性链.

但通常情况下,for循环并不比jQuery或更好Object.keys().map().我将在下面使用简单的for循环讨论两个潜在的问题.


是的,所以在其他答案中也指出,一个简单的Javascript替代方案

for(var index in object) { 
    var attr = object[index]; 
}
Run Code Online (Sandbox Code Playgroud)

这有两个潜在的问题:

1.您想要检查您要查找的属性是来自对象本身而不是来自原型链.这可以通过hasOwnProperty这样的功能来检查

for(var index in object) { 
   if (object.hasOwnProperty(index)) {
       var attr = object[index];
   }
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty.

jQuery.eachObject.keys功能自动照顾这.

2.普通for循环的另一个潜在问题是范围和非闭包.这有点复杂,但是请参考以下代码.我们有一堆带有ids button0,button1,button2等的按钮,我们想在它们上设置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);
       });
   }
}
Run Code Online (Sandbox Code Playgroud)

如果在一段时间后,我们点击任何按钮,我们将始终"点击最后!" 在控制台中,从不"先点击!" 或者"点击中间!".为什么?因为在执行onclick函数时,它将在那时messagesByButtonId[buttonId]使用buttonId变量显示.并且由于循环在那一刻结束,变量仍将是"button2"(它在最后一次循环迭代期间具有的值),因此将是,即"最后点击!".buttonIdmessagesByButtonId[buttonId]messagesByButtonId["button2"]

有关闭包的更多信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures.特别是该页面的最后一部分,涵盖了我们的示例.

再次,jQuery.eachObject.keys().map()为我们自动解决这个问题,因为它为我们提供了一个function(index, value)(具有闭包),因此我们可以安全地使用索引和值,并确保它们具有我们期望的值.

  • @DanielSchmidt它没有被弃用.http://devdocs.io/javascript/statements/for...in你指的是"for each(... in ...)",它与"for(... in ...)"不同" (10认同)
  • 只是说,你没有提供"更容易的选择" (3认同)
  • "更容易"并不总是"最好的",所以...... (2认同)

Sak*_*tel 73

for(var key in object) {
   console.log(object[key]);
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您可能想要检查找到的密钥是来自对象本身,还是来自原型链.使用object.hasOwnProperty(key)来检查 (14认同)
  • 是的,这就是为了控制每个键的属性值,如果你想看到aaa,bbb,ccc然后使用`console.log(key); (3认同)