2017-06-08 6 views
-1

項目にネストされた配列から、[1]の項目を取得:JSは、私は次のオブジェクト持っている[0] = someValueの

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

を私はsearchValueに基づいて配列を取得する方法を見つけたいです。

EDIT:

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; 
}) 

EDIT:Gmailからすべてのエイリアスの電子メールアドレスを取得するために必要としているSAMPLE DATA /ユースケース

このここに私以外の作業の試みがあります。

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

は、今私は(つまり、ハード配列のインデックスをコーディングしない)より汎用的な方法でこれをやろう

検索値:コンソールに次のようにGmailを開いたときにそれらを取得して入力することができます'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)は、配列でのみチェックする必要があります。
  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){item [1]}を返します) – Chris

関連する問題