【问题标题】:Each for object? [duplicate]每个对象? [复制]
【发布时间】:2012-08-07 12:53:18
【问题描述】:

我在 JavaScript 中有对象:

var object = someobject;

Object { aaa=true, bbb=true, ccc=true }

我该如何使用它们?

 object.each(function(index, value)) {
      console.log(value);
 }

不工作。

【问题讨论】:

标签: javascript jquery


【解决方案1】:

javascript 对象没有标准的 .each 函数。 jQuery 提供了一个函数。请参阅http://api.jquery.com/jQuery.each/ 以下应该可以工作

$.each(object, function(index, value) {
    console.log(value);
}); 

另一种选择是使用 vanilla Javascript,使用 Object.keys() 和数组 .map() 这样的函数

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

https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Object/keyshttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

这些通常比使用普通的 Javascript for 循环更好,除非您真正了解使用普通 for 循环的含义并了解它的特定特征(例如循环属性链)的用途。

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


是的,所以在其他答案中也指出,一个普通的 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];
   }
}

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

jQuery.eachObject.keys 函数会自动处理此问题。

2 。普通 for 循环的另一个潜在问题是作用域和非闭包问题。这有点复杂,但以下面的代码为例。我们有一堆 ID 为 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);
       });
   }
}

如果我们在一段时间后单击任何按钮,我们将始终得到“最后一次点击!”在控制台中,从不“先点击!”或“点击中间!”。为什么?因为在执行 onclick 函数时,它会使用buttonId 变量显示messagesByButtonId[buttonId]那一刻。由于此时循环已经完成,buttonId 变量仍将是“button2”(它在最后一次循环迭代期间的值),因此messagesByButtonId[buttonId] 将是messagesByButtonId["button2"],即“最后一次点击!” .

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

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

【讨论】:

  • “更简单的选项”不是你提供的,只是说
  • 没错,我稍后编辑了它。编辑以明确这一点。
  • “更简单”并不总是“最好的”,所以..
  • for .. in 语句为deprecated
  • @DanielSchmidt 它没有被弃用。 devdocs.io/javascript/statements/for...in您指的是“for each (... in ...)”,它不同于“for (... in ...)”
【解决方案2】:
for(var key in object) {
   console.log(object[key]);
}

【讨论】:

  • 谢谢,但这返回“真”,而不是 aaa,bbb,ccc :(
  • 是的,这就是它控制每个键的属性值的原因,如果您想查看 aaa、bbb、ccc,请使用console.log(key);
  • 请注意,您可能想要检查找到的键是来自对象本身,还是来自原型链。使用 object.hasOwnProperty(key) 检查
  • 是的,确实如此,但在对象原型中添加属性总是一件坏事:) 因为这会影响所有子对象,如数组、字符串等
  • 谢谢。它符合我的目标。
【解决方案3】:

var object = { "a": 1, "b": 2};
$.each(object, function(key, value){
  console.log(key + ": " + object[key]);
});
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"&gt;&lt;/script&gt;
//output
a: 1
b: 2

【讨论】:

  • 这是错误的! $.each 是 JQuery 框架!
  • 这取决于 jquery。有没有 jQuery 的解决方案?
  • 你应该在你的答案中添加一些标题,指定它依赖于 jQuery
猜你喜欢
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多