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 ); });