每个对象?

2022-08-30 04:42:27

我在JavaScript中有对象:

var object = someobject;

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

我如何使用每个?

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

不工作。


答案 1

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

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

另一种选择是使用 vanilla Javascript,使用 和 Array 函数,如下所示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-loop更好,除非你真正理解使用普通for-loop的含义,并看到它的特定特征(如循环属性链)的用途。

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


是的,所以在其他答案中也指出,一个简单的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 循环的另一个潜在问题是范围和非闭包。这有点复杂,但以下面的代码为例。我们有一堆带有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);
       });
   }
}

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

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

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


答案 2
for(var key in object) {
   console.log(object[key]);
}