我有一个目标:
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在$.splitTicket范围内丢失了。(也许这说明了问题的所在?)--另一件要注意的事情是键为"2517“的对象的”长度“--这是Google-Chrome Bug、javascript Bug还是正确的?
->注意,在当前断点上,tkey是0 (int),tval是未定义的(未定义),并且由于这段代码不会产生任何错误,它将遍历它2517次(不计算^^)。

发布于 2014-04-09 11:01:38
一点都不是窃听器。看起来,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 $.each源代码,如果您的对象不是"arraylike“,它似乎使用for..in。
我假设isArraylike为您的“真实”代码返回true ( false表示myObj)
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);
}发布于 2014-04-09 11:09:24
尝尝这个,
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
});活演示
您的代码在我的side.but上迭代了两次,您也可以尝试使用这个示例。
https://stackoverflow.com/questions/22960424
复制相似问题