Лодаш группа К - PullRequest
       4

Лодаш группа К

0 голосов
/ 06 декабря 2018

Мне нужно сгруппировать по проектам, чтобы для каждого проекта я группировался по историям, которые есть в этих проектах, и чтобы по каждой истории я показывал задачи.При выполнении примера мы увидим, что история 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 = '' + JSON.stringify(result, null, '  ') + '
';}
<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 голосов
/ 06 декабря 2018

Поскольку у вас уже есть ответ lodash, здесь есть ES6 реализация этого через один Array.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 = 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>
0 голосов
/ 06 декабря 2018

Используйте _.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>
...