gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:31:36 25 4
gpt4 key购买 nike

我有一个对象:

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

现在我想像这样遍历对象:

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

问题是,jQuery 在数组中遍历了 26 次,而值在 24 次情况下将是“未定义的”(我调试过它 - 这是事实)。因此它在到达第五个值(即第一个值)之前遍历对象 5 次。

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

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

附加信息:

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

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

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

DevTools Output

最佳答案

这根本不是错误。看起来 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);
}

关于javascript - jQuery - 使用数字键迭代对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22960424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com