Группировка значений в массиве на основе ключей с использованием JavaScript - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть следующие значения массива,

[
{
    "amount": 4.27,
    "month": 1,
    "year": 2017
},
{
    "amount": 2.46,
    "month": 1,
    "year": 2017
},
{
    "amount": 1.5,
    "month": 2,
    "year": 2017
},
{
    "amount": 28.24,
    "month": 2,
    "year": 2017
},
{
    "amount": 8.24,
    "month": 3,
    "year": 2017
},
{
    "amount": 3.65,
    "month": 3,
    "year": 2017
},
{
    "amount": 0.86,
    "month": 3,
    "year": 2017
},
{
    "amount": 0,
    "month": 1,
    "year": 2018
},
{
    "amount": 71.84,
    "month": 2,
    "year": 2018
},
{
    "amount": 26.62,
    "month": 3,
    "year": 2018
}]

, который должен быть сгруппирован по конкретным месяцам и годам , а окончательные значения должны быть в следующем формате,

[
{
    "amount": 6.63,
    "month": 1,
    "year": 2017
},
{
    "amount": 29.74,
    "month": 2,
    "year": 2017
},
{
    "amount":12.75,
    "month": 3,
    "year": 2017
},
{
    "amount": 0,
    "month": 1,
    "year": 2018
},
{
    "amount": 71.84,
    "month": 2,
    "year": 2018
},
{
    "amount": 26.62,
    "month": 3,
    "year": 2018
}]

Я привел этот пример: Группировка элементов массива с использованием объекта

Но я не могу разобрать итоговую часть, и все, что я получаю, это только первое значение из определенного месяца и года.

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Вы можете использовать array#reduce для группировки ваших данных на основе month и year и накапливать всю сумму в объекте на карте.Затем извлеките все значения и отсортируйте результат.

const data = [{ "amount": 4.27, "month": 1, "year": 2017 }, { "amount": 2.46, "month": 1, "year": 2017 }, { "amount": 1.5, "month": 2, "year": 2017 }, { "amount": 28.24, "month": 2, "year": 2017 }, { "amount": 8.24, "month": 3, "year": 2017 }, { "amount": 3.65, "month": 3, "year": 2017 }, { "amount": 0.86, "month": 3, "year": 2017 }, { "amount": 0, "month": 1, "year": 2018 }, { "amount": 71.84, "month": 2, "year": 2018 }, { "amount": 26.62, "month": 3, "year": 2018 } ],
    result = [...data.reduce((r,{amount, month, year}) => {
      const key = month + '/' + year;
      r.has(key) ? r.get(key).amount += amount: r.set(key, {amount, month, year});
      return r;
    },new Map).values()]
    .sort((a,b) => a.year - b.year || a.month - b.month);
console.log(result);
0 голосов
/ 26 апреля 2018

Для отсортированных данных вы можете проверить последний элемент и обновить значение или вставить новый объект в набор результатов.

var array = [{ amount: 4.27, month: 1, year: 2017 }, { amount: 2.46, month: 1, year: 2017 }, { amount: 1.5, month: 2, year: 2017 }, { amount: 28.24, month: 2, year: 2017 }, { amount: 8.24, month: 3, year: 2017 }, { amount: 3.65, month: 3, year: 2017 }, { amount: 0.86, month: 3, year: 2017 }, { amount: 0, month: 1, year: 2018 }, { amount: 71.84, month: 2, year: 2018 }, { amount: 26.62, month: 3, year: 2018 }],
    grouped = array.reduce((r, { amount, month, year }) => {
        var last = r[r.length - 1];
        if (last && last.year === year && last.month === month) {
            last.amount += amount;
        } else {
            r.push({ amount, month, year });
        }
        return r;
    }, []);

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 26 апреля 2018

Использование reduce, Object.values и sort

var fnGetKey = (obj) => JSON.stringify({year:obj.year, month:obj.month}); //get key from object
Object.values(arr.reduce( (a,c) => {
  var key = fnGetKey( c );
  !a[key] ? (a[key] = c) : (a[key].amount += c.amount); //Initialize with c if key doesn't exists in accumulator, else increment amount
  return a; //return accumulator
} ,{})).sort( (a,b) => a.year - b.year || a.month - b.month ); //sort by year and month

Демо

var arr = [{
    "amount": 4.27,
    "month": 1,
    "year": 2017
  },
  {
    "amount": 2.46,
    "month": 1,
    "year": 2017
  },
  {
    "amount": 1.5,
    "month": 2,
    "year": 2017
  },
  {
    "amount": 28.24,
    "month": 2,
    "year": 2017
  },
  {
    "amount": 8.24,
    "month": 3,
    "year": 2017
  },
  {
    "amount": 3.65,
    "month": 3,
    "year": 2017
  },
  {
    "amount": 0.86,
    "month": 3,
    "year": 2017
  },
  {
    "amount": 0,
    "month": 1,
    "year": 2018
  },
  {
    "amount": 71.84,
    "month": 2,
    "year": 2018
  },
  {
    "amount": 26.62,
    "month": 3,
    "year": 2018
  }
];

var fnGetKey = (obj) => JSON.stringify({
  year: obj.year,
  month: obj.month
}); //get key from object


var output = Object.values(arr.reduce((a, c) => {
  var key = fnGetKey(c);
  !a[key] ? (a[key] = c) : (a[key].amount += c.amount);
  return a;
}, {})).sort((a, b) => a.year - b.year || a.month - b.month);

console.log(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...