使用lodash

时间:2017-08-03 13:15:10

标签: javascript lodash

我使用一些复杂的数据对象,我需要动态地将一些数据从子项映射到父项,递归到顶层。抛开细节,我将在以下操作中堆叠。在最低级别的孩子和他们的直系父母之间,然后将递归地应用于父母:给出一系列儿童的数据...

 [ 
   [
     ['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中提取了一小部分实时数据用于测试。

2 个答案:

答案 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;
&#13;
&#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);