jQuery - 使用数字键迭代对象

时间:2014-04-09 10:57:43

标签: javascript jquery

我有一个对象:

var myObj = { 5: "foo", 25: "bar" };

现在我想要像这样走过这个对象:

$.each(myObj, function(key, value) {
    console.log(value); 
});

问题是,jQuery在数组中走了26次,而值将是"未定义"在24个案例中(我调试了它 - 这就是事实)。因此它在达到第五个值(这是第一个值)之前遍历对象5次。

我不想将对象转换为数组,因为我想在处理数据后将数据存储回堆栈。

这是一个jQuery-Bug,我的错误或如何解决这个问题?

其他信息:

我的Chrome的DevTools屏幕截图显示了运行时的对象。

sT.data.tasks包含与splitTicket相同的内容 - 只需要显示splitTicket,因为sT.data.tasks在$ .each-Scope中丢失。 (也许这表明问题?) - 另一件需要注意的事情是"长度"用钥匙" 2517" - 这是Google-Chrome Bug,javascript Bug还是只是正确的?

- >请注意,在当前断点处 tkey为0(int)且tval未定义(未定义),并且由于此代码不会产生任何错误,因此它会遍历2517次(不计算^^)

DevTools Output

2 个答案:

答案 0 :(得分:1)

这根本不是一个错误。看起来jQuery只是将这个对象视为一个数组并以正常方式迭代它,从0开始并转到最大的键。

for..in循环遍历对象中的属性。

使用以下内容只需2次:

for(key in myObj) {
    console.log(myObj[key]); 
};

你的例子对我来说很好看:

var myObj = { 5: "foo", 25: "bar" };
$.each(myObj, function(key, value) {
    console.log(value); 
});
foo
bar

查看$.each的jQuery源代码,如果您的对象不是“arraylike”,它似乎会使用for..in

我假设isArraylike为你的'真实'代码返回true(对于myObj来说是false

jQuery $ .each:

for ( i in obj ) {
    value = callback.call( obj[ i ], i, obj[ i ] );

    if ( value === false ) { break; }
}

jQuery isArraylike

function isArraylike(obj) {
    var length = obj.length,
        type = jQuery.type(obj);

    if (jQuery.isWindow(obj)) {
        return false;
    }

    if (obj.nodeType === 1 && length) {
        return true;
    }

    return type === "array" || type !== "function" && (length === 0 || typeof length === "number" && length > 0 && (length - 1) in obj);
}

答案 1 :(得分:1)

试试这个,

var myObj = { 5: "foo", 25: "bar" };
var i=0;
Object.keys( myObj ).forEach(function ( name, index ) {
    var value = myObj[name];
    console.log(++i);
    console.log(name); // the property name
    console.log(value); // the value of that property
    console.log(index); // the counter
});

直播DEMO

你的代码在我身边迭代两次。但你也可以尝试使用这个例子。