我使用一些复杂的数据对象,我需要动态地将一些数据从子项映射到父项,递归到顶层。抛开细节,我将在以下操作中堆叠。在最低级别的孩子和他们的直系父母之间,然后将递归地应用于父母:给出一系列儿童的数据...
[
[
['key 1', 1],
['key 2', null],
['key 3', 42]
],
[
['key 1', null],
['key 2', 42],
['key 3', 0]
],
[
['key 1', 21],
['key 2', 21],
['key 3', 21]
],
]
...我正在尝试让父数据看起来像这样:
[
[
'key 1', [1, null, 21]
],
[
'key 2', [null, 42, 21]
],
[
'key 3', [42, 0, 21]
]
]
最有可能的是,我可以使用good'ol for
来实现这一点,但我非常确定使用_.groupBy
,_.chain
或{{1 }}。我仍在努力_.thru
。
有点像放弃,在这里问,但我已经在这一天超过一天了,试图找到类似的东西并阅读lodash的数组和收藏品没有任何结果的函数。
如果你想在jsFiddle上测试它,我已经在这个fiddle
中提取了一小部分实时数据用于测试。
答案 0 :(得分:3)
您可以展平,然后按第一个索引进行分组,并将这些组映射到预期结果。
var data = [[["key 1",1],["key 2",null],["key 3",42]],[["key 1",null],["key 2",42],["key 3",0]],[["key 1",21],["key 2",21],["key 3",21]]];
var result = _(data)
.flatten()
.groupBy(_.head)
.map(function(v, k) {
return [k, _.map(v, _.last)];
})
.value();
console.log(result);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
答案 1 :(得分:1)
使用vanilla js:
let data = [[["key 1",1],["key 2",null],["key 3",42]],[["key 1",null],["key 2",42],["key 3",0]],[["key 1",21],["key 2",21],["key 3",21]]];
let tmp =data
// flatten subarrays
.reduce((a, c) => a.concat(c), [])
// create object using 1st index value as keys, array as value
.reduce((a, c) => {
a[c[0]] = a[c[0]] || [c[0],[]];
a[c[0]][1].push(c[1]);
return a
}, {});
// get all the arrays from object
let res = Object.values(tmp);
console.log(res);