Javascript: преобразование массива ответа объекта с помощью lodash, подчеркивания или corejavascript

Я работаю с highChart, чтобы создать диаграмму столбца. Любой, как я дошел до создания следующего массиваObj через общение с базой данных.

Теперь мне нужно преобразовать следующееsource массив объектов для вывода ниже.

var source = [
{data: 258, name: '2014'}
{data: 18, name: '2016'}
{data: 516, name: '2014'}
{data: 0, name: '2014'}
{data: 354, name: '2014'}
{data: 18, name: '2016'}
]`

Преобразовать этот массив объекта в

Output

[{
    name: '2014',
    data: [258, 516, 354]
  }, {
    name: '2016',
    data: [18, 0, 18]
}]

По сути, я хочу, чтобы мой массив группировался по имени (году), а данные должны быть в массиве.

Вот решения, которые я применил.

var source = [];
_.each(source, function(singlerec) {
      source.push({
        name: singlerec.name,
        data: singlerec.data  // Here It only assign single record
      });
    });
 4castle20 июл. 2016 г., 18:21
 Denish20 июл. 2016 г., 18:11
@ T.J.Crowder Спасибо, конечно, я сначала попробовал, но вы правы, я добавил свой прогресс в вопрос.
 4castle20 июл. 2016 г., 19:33
@ T.J.Crowder Lodash настолько лаконичен, что решение, как правило, все или ничего. Я не чувствую, что видение попытки ОП улучшает вопрос, если они действительно предприняли настоящую попытку. Функциональное программирование может быть трудно понять, особенно когда люди пытаются смешать его с императивным программированием.
 T.J. Crowder20 июл. 2016 г., 18:13
 T.J. Crowder20 июл. 2016 г., 18:12
Добавить чтонеправильно с выходом вашего решения. Кроме того, с уважением, ваше решение выглядит так, как будто оно не предпринимает никаких попытоксовсем сгруппировать вещи поname, Что очень похоже на просьбу кого-то еще добавить группировку по имени для вас.

Ответы на вопрос(3)

Решение Вопроса

_.groupBy а потом_.map в выходной формат.

var source = [{"data":258,"name":"2014"},{"data":18,"name":"2016"},{"data":516,"name":"2014"},{"data":0,"name":"2014"},{"data":354,"name":"2014"},{"data":18,"name":"2016"}];

var output = _(source)
  .groupBy('name')
  .map(function(v, k) { return { name: k, data: _.map(v, 'data') } })
  .value();

console.log(output);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>

Я использую чистую функцию JavaScript:

const pick = (obj, paths) => ({...paths.reduce((a, k) => ({...a, [k]: obj[k]}), {})})

function groupByAndConcat(data, groupBy, sums) {
    return data.reduce((results, r) => {
        const e = results.find((x) => groupBy.every((g) => x[g] === r[g]));
        if (e) {
            sums.forEach((k) => e[k] = [].concat(e[k], r[k]));
        } else {
            results.push(pick(r, groupBy.concat(sums)));
        }
        return results;
    }, []);
}

Итак, учитывая ваш источник выборки:

const source = [
    {data: 258, name: '2014'},
    {data: 18, name: '2016'},
    {data: 516, name: '2014'},
    {data: 0, name: '201,4'},
    {data: 354, name: '2014'},
    {data: 18, name: '2016'},
];

console.log(groupByAndConcat(source, ["name"], ["data"]))

выходы:

[{ name: "2014", data: Array [258, 516, 0, 354] }, { name: "2016", data: Array [18, 18] }]

Также возможно группировать или выполнять операции на нескольких объектах:

groupByAndConcat(source, ["name","month"], ["data","data2"])

есть способ итерировать массив один раз сreduce и даже без лодаш.

source.reduce((p, n) => {
    (p[n.name] || (p[n.name] = [])).push(n.data);
    return p
}, {})

Ваш ответ на вопрос