Javascript jQuery-使用数字键迭代对象

Javascript jQuery-使用数字键迭代对象,javascript,jquery,Javascript,Jquery,我有一个目标: var myObj = { 5: "foo", 25: "bar" }; 现在我想像这样穿过这个物体: $.each(myObj, function(key, value) { console.log(value); }); 问题是,jQuery在数组中遍历了26次,而值在24种情况下是“未定义的”(我调试了它-这是事实)。因此,在到达第五个值(即第一个值)之前,它会穿过对象5次 我不想将对象转换为数组,因为我想在处理数据后将数据存储回堆栈 这是一个jQuery错误

我有一个目标:

var myObj = { 5: "foo", 25: "bar" };
现在我想像这样穿过这个物体:

$.each(myObj, function(key, value) {
    console.log(value); 
});
问题是,jQuery在数组中遍历了26次,而值在24种情况下是“未定义的”(我调试了它-这是事实)。因此,在到达第五个值(即第一个值)之前,它会穿过对象5次

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

这是一个jQuery错误,还是我的错误,或者如何解决这个问题

其他信息: 下面是我的Chrome开发工具的屏幕截图,显示了运行时的对象

sT.data.tasks包含与splitTicket相同的内容-只需要显示splitTicket,因为sT.data.tasks在$each作用域中丢失。(也许这表明了问题的存在?)-另一个需要注意的是带有键“2517”的对象的“长度”-这是Google Chrome错误、javascript错误还是正确

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


这根本不是一个bug。看起来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

查看jQuery源代码中的
$。如果对象不是“arraylike”,则每个
都会使用
for..in

我假设isArraylike为您的“真实”代码返回true(myObj为
false

jQuery$。每个:

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

    if ( value === false ) { break; }
}
jQuery类似于Arraylike

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);
}
试试这个

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


您的代码在我这边迭代了两次。但您也可以尝试使用此示例。

我感觉您在这里遗漏了一些信息。您发布的代码工作正常,记录
“foo”
,然后记录
“bar”
您是对的,对不起,我将添加information@Cerbrus:它是有效的,但是OP想知道为什么(显然)它尝试
myObj[0]
myObj[1]
,而不是仅仅遍历它的键。为什么不使用for(myObj中的var键){console.log(key);}谢谢!我添加了一些可能会导致错误的信息。谢谢!就像一个符咒一样有效-这就成功了。那么是什么导致了这个错误呢?它是一个错误吗?来自jQuery源代码的额外细节将isArraylike粘贴到你的代码中,看看
isArraylike(st.data.tasks)
返回了什么,出于某种原因我猜是真的。