Lodash分组依据

时间:2018-12-06 16:12:32

标签: lodash

我需要的是按项目分组,对于每个项目,我都按照这些项目中的故事进行分组,并且针对每个故事,我都展示了任务。在执行示例时,我们将看到未显示与“ barney”项目相对应的历史记录41。它对故事进行分组,但不显示与未分组的仓库相对应的历史。 这是外观的一个例子

 [
  {
    "proyecto": "barney",
    "historia": 42,
    "tarea": [
      "dog",
      "lion",
      "cat"
    ],
    "historia": 41,
    "tarea": [
      "cat"
    ]
  },
  {
    "proyecto": "fred",
    "historia": 35,
    "tarea": [
      "dog",
      "goldfish"
    ]
  }
]

group();

function group()
{

var characters = [
  { 'proyecto': 'barney', 'historia': 42,  'tarea': 'dog' },
  { 'proyecto': 'barney', 'historia': 42,  'tarea': 'lion' },
  { 'proyecto': 'fred',   'historia': 35,  'tarea': 'dog' },
  { 'proyecto': 'barney', 'historia': 41,  'tarea': 'cat' },
  { 'proyecto': 'fred',   'historia': 35,  'tarea': 'goldfish' }
];

var result=_.chain(characters).groupBy("proyecto").map(function(v, i) {
  return {
    proyecto: i,
    historia: _.get(_.find(v, 'historia'), 'historia'),
    tarea: _.map(v, 'tarea')
  }
}).value();
document.body.innerHTML = '<pre>' + JSON.stringify(result, null, '  ') + '</pre>';
	
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

2 个答案:

答案 0 :(得分:2)

由于您已经有了lodash的答案,所以这里是通过单个Array.reduce ES6 实现,因此您必须进行比较:

var data = [ { 'proyecto': 'barney', 'historia': 42, 'tarea': 'dog' }, { 'proyecto': 'barney', 'historia': 42, 'tarea': 'lion' }, { 'proyecto': 'fred', 'historia': 35, 'tarea': 'dog' }, { 'proyecto': 'barney', 'historia': 41, 'tarea': 'cat' }, { 'proyecto': 'fred', 'historia': 35, 'tarea': 'goldfish' } ];

const result = data.reduce((r, {proyecto, historia, tarea}) => {
  r[proyecto] = r[proyecto] || {proyecto, historia: [], tarea: []}
  r[proyecto].historia.push(historia)
  r[proyecto].tarea.push(tarea)
  return r
}, {})

console.log(Object.values(result))

由于您使用的是reduce,因此不需要第二个_.map循环,并且所有操作都可以在一个"shot"中完成。

如果 ES6 存在问题,此处是与_.reduce相同的实现:

var data = [ { 'proyecto': 'barney', 'historia': 42, 'tarea': 'dog' }, { 'proyecto': 'barney', 'historia': 42, 'tarea': 'lion' }, { 'proyecto': 'fred', 'historia': 35, 'tarea': 'dog' }, { 'proyecto': 'barney', 'historia': 41, 'tarea': 'cat' }, { 'proyecto': 'fred', 'historia': 35, 'tarea': 'goldfish' } ];

const result = _.reduce(data, function(r,c) {
  r[c.proyecto] = r[c.proyecto] || {proyecto: c.proyecto, historia: [], tarea: []}
  r[c.proyecto].tarea.push(c.tarea)
  r[c.proyecto].historia.push(c.historia)
  return r
}, {})

console.log(_.values(result))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

答案 1 :(得分:1)

使用_.map()提取historia(就像对tarea所做的那样):

var characters = [
  { 'proyecto': 'barney', 'historia': 42,  'tarea': 'dog' },
  { 'proyecto': 'barney', 'historia': 42,  'tarea': 'lion' },
  { 'proyecto': 'fred',   'historia': 35,  'tarea': 'dog' },
  { 'proyecto': 'barney', 'historia': 41,  'tarea': 'cat' },
  { 'proyecto': 'fred',   'historia': 35,  'tarea': 'goldfish' }
];

var result= _(characters)
  .groupBy("proyecto")
  .map(function(v, i) {
    return {
      proyecto: i,
      historia: _.map(v, 'historia'),
      tarea: _.map(v, 'tarea')
    }
  })
  .value();
  
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>