jQuery.each()如何使用关联数组(对象)?

我有一个关联数组,里面有两个对象。 通过$(myassoc).each()运行它,回调只运行一次。 回调参数(索引和对象)也分别返回0和整个关联数组。

人们可以期望jQuery.each()为数组中的每个元素运行,将正确的键作为索引返回,将正确的元素作为对象返回。

为什么不发生这种情况,jQuery可以做我想要的事情吗?

我想你正在寻找jQuery.each()而不是.each()

试试这个:

  $.each(myassoc, function(index, value){ //your code }); 

试试这个:

 $.each(assocarray,function(i, value){ console.log('index: ' + i + ',value: ' + value); }); 

厉害。

不要$(associative_array).each(function () {...}) – 那是胡说八道

不要$.each(associative_array, function() {...}); – 这有一个不起眼的错误 (1)

要查看错误,请在javascript控制台中尝试:

 > $.each({foo:1, length:-1, bar:2}, console.log) foo 1 length -1 bar 2 > $.each({foo:1, length:0, bar:2}, console.log) 

第一个例子输出三行键值对。 第二个没有输出!

故事的寓意, 不要在对象上使用jQuery.each() 。 (JavaScript中的对象与关联数组本质上是一样的 。)事情可能永远都可以正常工作,但是你冒的风险是,有一天某个对象碰巧有一个名为length的成员,它的值恰好是0 ,然后你就有了一个bug无处不在,可能很难解释。 (通过这个答案的重要性,我会让你猜到,这是不是发生在我身上。)

如错误报告中所述 :

如果需要遍历具有length属性的对象的所有键,则jQuery.each不是正确的解决方案。

我建议进一步说,jQuery.each不应该依赖于关联数组。

(1)这个“bug”可能永远不会被修复,因为$ .each()历史上在数组上使用Duck Typing :“具有length属性的数组和类似数组的对象(例如函数的参数对象)由数字索引迭代。 “


这是我使用[感谢Dominik ] 循环遍历对象的属性名称和值 ,或换句话说,关联数组的键和值:

 function looper(object, callback) { for (var key in object) { if (object.hasOwnProperty(key)) { if (false === callback.call(object[key], key, object[key])) { break; } } } return object; } 

looper()是$ .each()的替代品

 > looper({foo:1, length:0, bar:2}, console.log) foo 1 length 0 bar 2 

就像$ .each()一样 :

  • 在回调中, this是每个值
  • 在回调内部,返回false (不仅仅是falsy)会终止循环
  • looper()返回最初传递给它的对象
  • looper()适用于数组和对象。

使用:

 var a = []; looper({foo:1, length:0, bar:2}, function(k, v) { a.push(k+"="+v); }); console.assert("foo=1,length=0,bar=2" === a.join()); 

尝试使用$ .each(),你会得到一个空的结果。 因为它将此特定对象解释为零长度的类数组对象。

问题是$.each()函数在内部检索并使用传递的集合的length属性。 但是在没有整数索引的关联数组中 length似乎总是为0 。 对于$.each()现在似乎没有什么$.each()

$.each()函数在内部检索并使用传递的集合的length属性。

解决方案只是使用对象。

 var obj = { "flammable": "inflammable", "duh": "no duh" }; $.each( obj, function( key, value ) { alert( key + ": " + value ); });