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

Hub*_*bro 11 javascript jquery associative-array

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

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

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

小智 20

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

试试这个:

    $.each(myassoc, function(index, value){
      //your code
    });
Run Code Online (Sandbox Code Playgroud)


the*_*dox 8

试试这个:

$.each(assocarray,function(i, value){
  console.log('index: ' + i + ',value: ' + value);
});
Run Code Online (Sandbox Code Playgroud)


Bob*_*ein 6

厉害.

$(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)
Run Code Online (Sandbox Code Playgroud)

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

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

错误报告中所述:

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

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

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


下面是我用[感谢多米尼克 ]遍历属性名称和值的对象,或者换一种说法,关联数组的键和值:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

> looper({foo:1, length:0, bar:2}, console.log)
  foo 1
  length 0
  bar 2
Run Code Online (Sandbox Code Playgroud)

就像$ .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());
Run Code Online (Sandbox Code Playgroud)

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


ley*_*nnx 5

问题在于该$.each()函数在内部检索并使用length传递的集合的属性。但是在没有整数索引的关联数组中length似乎总是0. 对于$.each()目前来说,似乎是没什么通过行走。

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

解决方案只是使用一个对象来代替。

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