2017-10-10 11 views
1

私はこのような配列の配列を持っています。配列の配列を分割する

const data = [ 
 
    ['list1'], 
 
    ['item1', '1'], 
 
    ['item2', '2'], 
 
    ['item3', '3'], 
 
    ['item4', '4'], 
 
    [' '] 
 
    ['list2'], 
 
    ['item1', '1'], 
 
    ['item2', '2'], 
 
    ['item3', '3'], 
 
    ['item4', '4'], 
 
    [' '] 
 
    ['list3'], 
 
    ['item1', '1'], 
 
    ['item2', '2'], 
 
    ['item3', '3'], 
 
    ['item4', '4'], 
 
    [' '] 
 
]

& LIST3は子供のような項目が含まれLIST2私は、& LIST3そのリスト1ので、より構造化されたコンテナを構築するために空の値LIST2、リスト1の間のすべてのアイテムを取得する必要があります。例えば

const data2 = { 
 
    'list1': {'item1': '1', 'item2': '2', 'item3': '3', 'item4': '4'}, 
 
    'list2': {'item1': '1', 'item2': '2', 'item3': '3', 'item4': '4'}, 
 
    'list3': {'item1': '1', 'item2': '2', 'item3': '3', 'item4': '4'}, 
 
    'list4': {'item1': '1', 'item2': '2', 'item3': '3', 'item4': '4'} 
 
}

{

いただきましリストのヘッダ間のアイテムを取得するためのデータ配列を照会するための最も効率的な方法はありますか?私はlodashにはインデックスを取る_.sliceメソッドがあるが、私は区切り文字として配列の値を使用する方法を見ることができません参照してください。

答えて

2

このお試しください:私は型エラー `TypeError例外を取得し

const data = [ 
 
    ['list1'], 
 
    ['item1', '1'], 
 
    ['item2', '2'], 
 
    ['item3', '3'], 
 
    ['item4', '4'], 
 
    [' '], 
 
    ['list2'], 
 
    ['item1', '1'], 
 
    ['item2', '2'], 
 
    ['item3', '3'], 
 
    ['item4', '4'], 
 
    [' '], 
 
    ['list3'], 
 
    ['item1', '1'], 
 
    ['item2', '2'], 
 
    ['item3', '3'], 
 
    ['item4', '4'], 
 
    [' '] 
 
]; 
 

 
var result = {}; 
 
var lastList = null; 
 
for (var item of data) { 
 
    if (item.length == 1 && item[0] != ' ') { 
 
    result[item[0]] = lastList = {}; 
 
    } 
 

 
    else if (lastList != null && item.length == 2) { 
 
    lastList[item[0]] = item[1]; 
 
    } 
 
} 
 

 
console.log(result);

+1

2番目の 'if'は' else if'ですか? – styfle

+0

@styfleええ、それはパフォーマンスに役立つでしょう – Xiaoy312

+0

これはトリックです。以前の答えよりも確かに理解できる。唯一の問題は、リストの名前とアイテムの名前が異なる可能性が高いことです。つまり、 'list'と 'item'で始まらないでしょう – user1513388

2

指定されたキーを持つ最後のオブジェクトへの参照に対してクロージャを使用することで、配列全体を減らすことができます。

var data = [['list1'], ['item1', '1'], ['item2', '2'], ['item3', '3'], ['item4', '4'], [' '], ['list2'], ['item1', '1'], ['item2', '2'], ['item3', '3'], ['item4', '4'], [' '], ['list3'], ['item1', '1'], ['item2', '2'], ['item3', '3'], ['item4', '4'], [' ']], 
 
    result = data.reduce(function (ref) { 
 
     return function (r, a) { 
 
      if (1 in a) { 
 
       ref[a[0]] = a[1]; 
 
      } else if (a[0].trim()) { 
 
       r[a[0]] = {}; 
 
       ref = r[a[0]] 
 
      } 
 
      return r; 
 
     }; 
 
    }(undefined), {}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

を:未定義に '1' を検索するためのオペレータの中で 'を使用することはできません'' if(1 in a) '行に書いてください。 – user1513388

+0

@ user1513388、IE11でも動作しますが、どこからエラーが出ますか? –

+0

私はnodeJSを使用しています – user1513388