2017-10-10 86 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