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

时间:2011-06-08 08:37:43

标签: javascript jquery associative-array

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

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

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

4 个答案:

答案 0 :(得分:18)

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

试试这个:

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

答案 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

Just like $.each()

  • 在回调中,this是每个值
  • 在回调中,返回false(不仅仅是假)终止循环
  • 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(),你会得到一个空的结果。因为它将此特定对象解释为零长度的类数组对象。

答案 3 :(得分:2)

问题是$.each()函数在内部检索并使用传递集合的length属性。但是在没有整数索引的关联数组中,length似乎总是0。对于$.each(),现在似乎没有任何东西要经过。

  

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

解决方案只是改为使用对象。

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