我有一个看起来像这样的数组。
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'],
[' ']
]
我需要获取list1,list2和amp;之间的所有项目。 list3和空值构建一个更结构化的容器,以便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
方法,它接受一个索引,但是我看不到使用数组值作为分隔符的方法。
答案 0 :(得分: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; }

答案 1 :(得分: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);