我有一个包含密钥length
的JS哈希(表示与哈希长度完全不同的东西),需要迭代它。
问题是jQuery.each
拒绝迭代这个,因为它检测到length
属性并且认为它必须是数组或类似数组的对象。
来自jQuery文档:
具有length属性的数组和类数组对象(例如函数的参数对象)>由数字索引迭代,从0到length-1。其他对象通过它们进行迭代 命名属性。
This JS fiddle说明了问题。
好吧,所有这些都记录在案并且可以理解。但是,如果我拥有名为length
的属性,该怎么办?在迭代哈希之前和之后我是否必须进行痛苦的重命名,或者是否有可能告诉jQuery忽略此属性并将其视为任何其他对象属性?
提前多多谢谢!
答案 0 :(得分:2)
如何不使用jquery.each但......
for (var key in testHash2) {
if (testHash2.hasOwnProperty(key)) {
$('#result').append($('<li />').text(key + ':' + testHash2[key]));
}
}
<强>已更新强> 忘了用“hasOwnProperty”来清理循环以防万一...
答案 1 :(得分:1)
这是一个修复该行为的快速补丁:
(function($,undefined){
var initialEach = $.each;
$.each = function(obj,fn){
if($.isArray(obj) || obj.length === undefined)
return initialEach.apply(this,arguments);
// else iterate over the object that contains a 'length' property
for(var key in obj)
if(obj.hasOwnProperty(key))
fn.call(obj[key],key,obj[key]);
};
})(jQuery);
这是一个现场演示,可以理顺:http://jsfiddle.net/gion_13/vwWm6/