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)
返回了什么,出于某种原因我猜是真的。