分割一组数组

我有一个看起来像这样的数组的数组。

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和列表3之间的所有项目以及空值来构build更加结构化的容器,以便list1,list2和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方法需要一个索引,但我不能看到一种方法来使用数组的值作为分隔符。

尝试这个:

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

你可以通过使用一个闭包对给定键的最后一个对象的引用来减less整个数组。

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