我有一个关联数组,里面有两个对象。通过$(myassoc).each()
运行此回调,回调只运行一次。回调参数(索引和对象)也分别返回0和整个关联数组。
可以期望jQuery.each()
为数组中的每个元素运行,将正确的键作为索引返回,将正确的元素作为对象返回。
为什么不发生这种情况,jQuery可以做我想要的事情吗?
答案 0 :(得分:18)
答案 1 :(得分:8)
试试这个:
$.each(assocarray,function(i, value){
console.log('index: ' + i + ',value: ' + value);
});
答案 2 :(得分:5)
不要$(associative_array).each(function () {...})
- 那是nonsense
不要$.each(associative_array, function() {...});
- 含有晦涩的bug (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中的对象是essentially same thing作为关联数组。)事情可能永远正常,但是你冒的风险是有一天某个对象碰巧有一个名为length
的成员及其值碰巧恰好是0
,然后你就有了一个无处可寻的错误,很难解释。 (通过这个答案的重要性,我会让你猜到,这是不是发生在我身上。)
如bug report中所述:
如果需要迭代具有length属性的对象的所有键,则jQuery.each不是正确的解决方案。
我建议更进一步,jQuery.each不应该依赖于关联数组。
(1)这个“bug”可能永远不会被修复,因为$ .each()历史上在数组上使用Duck Typing:“具有length属性的数组和类似数组的对象(例如函数的arguments对象)由数字索引迭代。“
这是我使用 [thanks 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
this
是每个值false
(不仅仅是假)终止循环使用:
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(),你会得到一个空的结果。因为它将此特定对象解释为零长度的类数组对象。
答案 3 :(得分:2)
问题是$.each()
函数在内部检索并使用传递集合的length
属性。但是在没有整数索引的关联数组中,length
似乎总是0
。对于$.each()
,现在似乎没有任何东西要经过。
$.each()
函数在内部检索并使用length
传递集合的属性。
解决方案只是改为使用对象。
var obj = {
"flammable": "inflammable",
"duh": "no duh"
};
$.each( obj, function( key, value ) {
alert( key + ": " + value );
});