2017-10-10 106 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'], 
 
    [' '] 
 
]

我需要得到所有的列表1之間的項目,列表2 &項目list3和空值,以建立一個更加結構化的容器內,使列表1,列表2 &項目list3包括的項目,如兒童。例如 {

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

試試這個:

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

第二個if應該是else else嗎? – 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 a)'行中。 – user1513388

+0

@ user1513388,它甚至可以在IE11中工作,你從哪裏得到錯誤? –

+0

我使用nodeJS – user1513388