我有一个对象:
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次(不计算^^)
答案 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
你的代码在我身边迭代两次。但你也可以尝试使用这个例子。