2017-06-08 30 views
-1

我有以下目的:JS得到[1]從與項目嵌套數組[0] = someValue中

GLOBALS = [ 
    [...], 
    [...], 
    [ 
     [...], 
     ["searchValue", [<interestingInfo>]] 
    ] 
] 

我想找到一種方式來獲得基於所述searchValue陣列。

編輯:這裏是我的非工作的嘗試:

GLOBALS.map(function(item){ 
    if(item && item.constructor === Array) 
     return item.map(function(itemLvl2) { 
      if(itemLvl2 && itemLvl2.constructor === Array) 
       return itemLvl2.map(function(itemLvl3) { 
        return itemLvl3 && itemLvl3.constructor === Array && itemLvl3[0] == 'searchValue' 
       }); 
      else 
       return false; 
     }); 
    else 
     return false; 
}) 

編輯:樣本數據/使用例

在需要這一點是爲了從Gmail獲得所有別名電子郵件地址。你可以讓他們打開Gmail並輸入以下內容到控制檯:

GLOBALS[17][15][1].map(function(item) { return item[1]; }) 

現在,我嘗試這樣做在一個更通用的方法(即不硬編碼的數組索引)

搜索值是'cfs'

+0

我有一些嘗試與array.map,但與嵌套 – Chris

+1

你爲什麼不使用對象而不是無限的嵌套數組奮鬥?它會讓你的生活更輕鬆。 –

+0

請勿使用'.map()'進行搜索,將其用於映射。使用'.find()'或'.findIndex()'進行搜索。 – nnnnnn

回答

1

如上所述,您可以使用遞歸來擺脫硬編碼級別。

的優化:

  1. if (JSON.stringify(array).indexOf(search) < 0) return;。這將確保當前對象樹是否具有指定的值。否則,整個樹會被跳過。
  2. Array.isArray(array)將enfore僅檢查數組。
  3. array.indexOf(search) < 0將檢查搜索是否在這個數組中。如果未找到,則值存在於某個子節點中。這也將消除僅檢查第一個值的依賴性。是的,這會增加表現,但即使訂單改變也會起作用。
  4. Array.some因爲是第一個正確的值會短路迴路。
function getSearchValue(array, search) { 
    if (JSON.stringify(array).indexOf(search) < 0) return; 
    if (Array.isArray(array)) { 
    if (array.indexOf(search) < 0) { 
     var r = null; 
     array.some(function(item) { 
     r = getSearchValue(item, search) 
     return !!r 
     }) 
     return r; 
    } else { 
     return array; 
    } 
    } 
} 
+0

完美。我現在可以做getSearchValue(GLOBALS,'cfs')[1] .map(function(item){return item [1]}) – Chris