2012-05-14 35 views
2

我試圖做一個函數從多維數組中刪除空值刪除空值,但它並不能很好地工作。它不會穿透到最後一層數組,並且當兩個空值相鄰時不會移除。從陣列,剪接

function isArray(obj) { 
    // http://stackoverflow.com/a/1058753/1252748 
    return Object.prototype.toString.call(obj) === '[object Array]'; 
} 

function removeEmptyArrayElements(obj) { 

    for (key in obj) { 
     if (obj[key] === null) { 

      obj = obj.splice(key, 1); 

     } 
     var isArr = isArray(obj[key]); 
     if (isArr) { 
      removeEmptyArrayElements(obj[key]); 
     } 

    } 
    return obj; 
} 
+1

的可能重複的[從在Javascript中的數組中刪除空元素(http://stackoverflow.com/questions/281264/remove-empty-elements-from-an-array-in-javascript) – Baz1nga

+0

更好檢查一些JavaScript教程首先;)特別是有關數組和對象及其差異的章節以及如何正確處理它們。 – Andreas

+0

你有什麼建議找到這些教程的好地方嗎? – 1252748

回答

7

當你迭代它不要從一個對象元素。

不要陣列,可以使用for ... in

待辦事項利用高階功能,如filtermap。試試這個:

function removeEmptyArrayElements(arr) { 
    if (!isArray(arr)) { 
     return arr; 
    } else { 
     return arr.filter(function(elem) { 
      return elem !== null 
     }).map(removeEmptyArrayElements) 
    } 
} 

說明:

「高階」功能是使用其他功能的價值功能 - 無論是接受它們作爲參數,或返回他們,或兩者兼而有之。在這種情況下,我使用了Javascript的Array類的兩個方法,它們接受一個函數作爲參數,並使用它來構建並返回一個新數組。

someArray.filter(功能)呼叫someArray每個元件上功能,並返回包含僅對於功能返回true的元素的新陣列。在這種情況下,我傳遞的函數是function(elem) { return elem !== null } - 也就是說,如果元素不爲null,則返回true的匿名函數。所以這個filter調用的結果是刪除了所有空值的原始數組。

現在我們想從結果中的任何元素中刪除任何自身爲數組的元素。我用mapsomeArray.map(函數)也會在數組的每個元素上調用函數,但不是基於這些結果返回其輸入的子集,而只是返回結果本身。例如,[1,2,3].map(function(x){return x*2})返回數組[2,4,6]。在這種情況下,我們傳遞的函數是我們正在定義中的函數..遞歸調用回removeEmptyElements

我們確實需要一種方法來阻止這種無盡的自我調用循環,這就是外部if的用途 - 當調用不是數組的元素時,我們只是按原樣返回它。

+0

它的工作原理!我不知道如何,但它的工作原理!我將需要調查一下..非常感謝。 – 1252748

2

您正在循環使用要刪除的數組。這使您「當兩個空值相鄰不刪除」錯誤。該「它不會滲透到陣列的最後一層」一部分可能是因爲你沒有在obj[key]重新分配的值。數組按值複製,未被引用。

我會做這樣的:

function isArray(obj) { 
    // http://stackoverflow.com/a/1058753/1252748 
    return Object.prototype.toString.call(obj) === '[object Array]'; 
} 

function removeEmptyArrayElements(arr) { 
    var i; 
    for (i = 0; i < arr.length; i += 1) { 
     if (arr[i] === null) { 
      arr = arr.splice(i, 1); 
      i -= 1; // decrement counter! 

     } else if (isArray(arr[i])) { 
      arr[i] = removeEmptyArrayElements(arr[i]); 
     } 
    } 
    return arr; 
} 
+0

謝謝!你仍然在拼接鍵,但沒有定義。我嘗試用我替換,但創建了一些崩潰我的瀏覽器:( – 1252748

+0

嗯,也許拼接不能正常工作,並最終在循環?檢查拼接後的數組長度,它應該減少了1。 – Halcyon