如何使用Lodash在JavaScript中对特定字段中的对象数组进行分组?

时间:2016-01-28 04:28:03

标签: javascript lodash

修改 我认为这是一个与简单Start-Process不同的问题,因为我试图按所有键进行分组并返回散列图而不是数组。

我有以下对象的数组:

_.groupBy

我正在尝试将其转换为这种格式:

items = [
  { created_at: "01/01/2016", name: "bob", age: 21, height: 60 },
  { created_at: "01/02/2016", age: 22, height: 70 },
  { created_at: "01/03/2016", name: "alice", age: 23 }
]

我的要求是我忽略{ "name": [ { "value": "bob", "created_at": "01/01/2016" }, { "value": "alice", "created_at": "01/03/2016" } ], "age": [ { "value": 21, "created_at": "01/01/2016" }, { "value": 22, "created_at": "01/02/2016" }, { "value": 23, "created_at": "01/03/2016" } ], "height": [ { "value": 60, "created_at": "01/01/2016" }, { "value": 70, "created_at": "01/02/2016" } ] } 字段,但将其他所有字段分组。

一个解决方案是:



created_at

var items = [
  { created_at: "01/01/2016", name: "bob", age: 21, height: 60 },
  { created_at: "01/02/2016", age: 22, height: 70 },
  { created_at: "01/03/2016", name: "alice", age: 23 }
]

var store = {}
for(var i=0; i < items.length; i++) {
  var item = items[i]
  
  for(key in item) {
    if(key === "created_at") {
      continue
    }
    
    value = item[key]

    if(!store[key]) {
      store[key] = []
    }

    store[key].push({
      value: value,
      created_at: item.created_at
    })
  }
}

$('pre').text(JSON.stringify(store, null, 2))
&#13;
&#13;
&#13;

我想知道在<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <body><pre></pre></body>中是否有一些很酷的方法可以使用lodash.map()或其他东西?我不太了解如何正确使用它们并试图学习新的,更优雅的方法来编写代码。

2 个答案:

答案 0 :(得分:0)

使用reduce可能是最短的方式。

var baseKey = 'created_at';

var result = items.reduce(function(col, item) {
  Object.keys(item).forEach(function(key) {
    if (key === baseKey || !item[key]) return;
    var o = { value: item[key] };
    o[baseKey] = item[baseKey];
    (col[key] = col[key] || []).push(o);
  });
  return col;
}, {});

JSFiddle演示:https://jsfiddle.net/pLcv1am2/6/

答案 1 :(得分:0)

你特别询问了lodash,所以这个答案是用lodash构建的。

注意我使用_.chain方法 - 这样可以方便地链接多个操作,而不是分别运行它们。

一种方式(我确定很多其他人)让它非常接近(不完美)是这样的:

items = _.chain(items)
  .map(function(n) {
    var created = _.get(n, 'created_at');
    var arr = [];
    _.each(n, function(n, k) {
      if (k != 'created_at') {
        arr.push({
          'field': k,
          'value': n,
          'created_at': created
        });
      }
    });
    return arr;
  })
  .flatten()
  .groupBy('field')
  .value();

这导致集合看起来像这样:

{ "name": 
    [ 
        { "field": "name", "value": "bob", "created_at": "01/01/2016" }, 
        { "field": "name", "value": "alice", "created_at": "01/03/2016" } 
    ], 
  "age": [
     ....

Here's a Fiddle用于播放此代码。