我可以使用Lodash来解决问题吗?一个对象数组?

时间:2016-01-15 15:29:05

标签: javascript lodash

目前我的数组看起来像

[{index: 1, value: 'A'},
 {index: 1, value: 'B'},
 {index: 2, value: 'C'},
 {index: 5, value: 'D'}]

我试图将其变成像

这样的对象
{
  1: ['A', 'B'],
  2: ['C'],
  5: ['D']
}

目前我只是对数组进行排序,然后运行一个复杂的for循环

2 个答案:

答案 0 :(得分:4)

您可以使用.groupBy + .mapValues + .map



var data = [{
  index: 1, value: 'A'
}, {
  index: 1, value: 'B'
}, {
  index: 2, value: 'C'
}, {
  index: 5, value: 'D'
}];

var result = _(data)
  .groupBy('index')
  .mapValues(function (el) {
    return _.map(el, 'value');
  })
  .value();

console.log(result);

<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.0.0/lodash.js"></script>
&#13;
&#13;
&#13;

您也可以避免多次操作,只能使用.reduce这样的

&#13;
&#13;
var data = [{
  index: 1, value: 'A'
}, {
  index: 1, value: 'B'
}, {
  index: 2, value: 'C'
}, {
  index: 5, value: 'D'
}];

var result = data.reduce(function (prev, current) {
  if (typeof (prev[current.index]) === 'undefined') {
    prev[current.index] = [];
  }
 	
  return prev[current.index].push(current.value) && prev;
}, {});
console.log(result);
&#13;
<script src="http://gh-canon.github.io/stack-snippet-console/console.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

@ Alexander的答案可能比这更明确,但我沉迷于partials并对匿名函数过敏,所以这里有部分版本!

var data = [
    {index: 1, value: 'A'},
    {index: 1, value: 'B'},
    {index: 2, value: 'C'},
    {index: 5, value: 'D'}
];

// define a couple of resuable functions for these objects
var getValueProp = _.partial(_.get, _, 'value');
var mapToValueProp = _.partial(_.map, _, getValueProp);

// get the answer!
var result = _(data)
    .groupBy('index')
    .mapValues(mapToValueProp)
    .value();