2015-03-08 11 views
-1

我个人喜欢$ .each函数 - 它允许以简单和相等的方式处理数组和对象。但有时,当应用程序的某些部分将非对象传递给该函数时,我得到运行时错误'无法获取未定义的属性长度'。检查变量是否适合jQuery每个

这样的错误实际上很难调试,因为不知道$ .each函数是由哪个函数引起的。所以我认为 - 在每次$ .each调用之前,对我来说更容易进行对象检查。

如何检查对象是否适合$ .each函数?可能有一种方法来扩展jQuery的功能 - 至少知道发送到$ .each的是什么?因为过度搜索运行时错误是相当困难的 - 我有370+使用$。每个代码...

在此先感谢!

编辑:

var obj = {1: [{}, {}], 2: []}; 
$.each(obj, function(key, value){ 
    $.each(value, function(index, el){ 
    //fails with 'Uncaught TypeError: Cannot read property 'length' of undefined' 
    }) 

}) 
+1

'如果(VARIABLENAME && variableName.length){$。每个(...); }'?尽管如此,为了获得更好,更有用的答案,您需要向我们展示一些代码,理想情况下重现失败的代码。 – 2015-03-08 19:30:30

+0

用if/else语句检查,然后将变量传递给$ .each。要检查变量是否是对象,可以使用'typeof(var)'和'var instanceof something'。希望能帮助到你。 – 2015-03-08 19:35:33

+0

您可能可以覆盖该方法以进行调试或制作自定义方法。找到一个例子[here。](http://www.bennadel.com/blog/1624-ask-ben-overriding-core-jquery-methods.htm)。 – Wilmer 2015-03-08 19:40:16

回答

1

自己编写一个简单的函数,其检查的对象是对象或阵列或没有。

function isObjectValidForEach(obj) { 
    if(Object.prototype.toString.call(obj) === '[object Array]' || Object.prototype.toString.call(obj) === '[object Object]') { 
     return true; 
    } 
    return false; 
} 

var a = []; 
isObjectValidForEach(a); 
//true 
var b = {}; 
isObjectValidForEach(b); 
//true 
var c = "hjgfkjwe"; 
isObjectValidForEach(c); 
//false 

那么你的代码将变为

var obj = {1: [{}, {}], 2: []}; 

if(isObjectValidForEach(obj)) { 
    $.each(obj, function(key, value){ 
     if(isObjectValidForEach(value)) { 
      $.each(value, function(index, el){ 
       // your code 
      }); 
     } 
    }); 
} 
+0

我将使用代码扩展jquery,所以我至少会通过安装arguments.callee.caller.toString知道发生了什么。 ) – 2015-03-08 19:51:10