2015-03-08 44 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