Группируйте данные по ключу и возвращайте новый объект, содержащий значение суммы другого ключа. - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть такие данные:

const data = [
  {name: 'alice', colors: ['red', 'blue'], count: 1, day: '2018-11-12'},
  {name: 'duke', colors: ['red', 'blue'], count: 1, day: '2018-12-12'},
  {name: 'bob', colors: ['blue'], count: 1, day: '2018-11-11'},
  {name: 'alice', colors: ['blue'], count: 1, day: '2018-11-10'},
  {name: 'carl', colors: ['blue'], count: 3, day: '2018-11-01'},
  {name: 'bob', colors: ['red'], count: 1, day: '2017-11-12'},
  {name: 'bob', colors: [], count: 1, day: '2018-11-12'},
  {name: 'bob', colors: ['red', 'blue', 'yellow'], count: 1, day: '2018-11-11'},
  {name: 'alice', colors: ['yellow'], count: 2, day: '2018-11-11'},
  {name: 'duke', colors: ['red', 'yellow'], count: 1, day: '2018-11-12'},
];

Теперь я хочу сгруппировать данные по дням и получить сумму подсчета ключей, чтобы получить массив таких объектов:

const newData = [
  {day: '2018-11-12', countSum: 5}, // sum of {name: 'alice', colors: ['red', 'blue'], count: 1, day: '2018-11-12'}, {name: 'alice', colors: [blue'], count: 2, day: '2018-11-12'}, {name: 'bob', colors: [], count: 1, day: '2018-11-12'}, {name: 'duke', colors: ['red', 'yellow'], count: 1, day: '2018-11-12'}
  {day: '2018-12-12', countSum: 1},
  {day: '2018-11-11', countSum: 2}, // sum of {name: 'bob', colors: [blue'], count: 1, day: '2018-11-11'}, {name: 'bob', colors: ['red', 'blue', 'yellow'], count: 1, day: '2018-11-11'}
  {day: '2018-11-10', countSum: 1},
  {day: '2018-11-01', countSum: 3},
  {day: '2017-11-12', countSum: 1},
]

Я пытался использовать groupBy Lodash для группировки данных по дням, но не могу подсчитать сумму ключа подсчета. Мне нужна помощь.

Большое спасибо

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Аналогично решению "Уменьшить" с помощью charlietfl, вы можете использовать для ... тоже.

const data = [
  {name: 'alice', colors: ['red', 'blue'], count: 1, day: '2018-11-12'},
  {name: 'duke', colors: ['red', 'blue'], count: 1, day: '2018-12-12'},
  {name: 'bob', colors: ['blue'], count: 1, day: '2018-11-11'},
  {name: 'alice', colors: ['blue'], count: 1, day: '2018-11-10'},
  {name: 'carl', colors: ['blue'], count: 3, day: '2018-11-01'},
  {name: 'bob', colors: ['red'], count: 1, day: '2017-11-12'},
  {name: 'bob', colors: [], count: 1, day: '2018-11-12'},
  {name: 'bob', colors: ['red', 'blue', 'yellow'], count: 1, day: '2018-11-11'},
  {name: 'alice', colors: ['yellow'], count: 2, day: '2018-11-11'},
  {name: 'duke', colors: ['red', 'yellow'], count: 1, day: '2018-11-12'},
];

let result = {}

for(let d of data) {
  result[d.day] = result[d.day] || { day: d.day, countSum: 0}
  result[d.day].countSum += d['count']
}

console.log(Object.values(result))
0 голосов
/ 12 ноября 2018

Вот подход Лодаш .Сначала groupBy day, а затем map каждый результат этой группы и выполнение sumBy для каждой группы по count, вот и все

var data = [{"name":"alice","colors":["red","blue"],"count":1,"day":"2018-11-12"},{"name":"duke","colors":["red","blue"],"count":1,"day":"2018-12-12"},{"name":"bob","colors":["blue"],"count":1,"day":"2018-11-11"},{"name":"alice","colors":["blue"],"count":1,"day":"2018-11-10"},{"name":"carl","colors":["blue"],"count":3,"day":"2018-11-01"},{"name":"bob","colors":["red"],"count":1,"day":"2017-11-12"},{"name":"bob","colors":[],"count":1,"day":"2018-11-12"},{"name":"bob","colors":["red","blue","yellow"],"count":1,"day":"2018-11-11"},{"name":"alice","colors":["yellow"],"count":2,"day":"2018-11-11"},{"name":"duke","colors":["red","yellow"],"count":1,"day":"2018-11-12"}];

var res =_(data)
           .groupBy('day')
           .map((grp, day) => ({day, countSum: _.sumBy(grp, 'count')}))
           .value();

console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 12 ноября 2018

Вы можете использовать Array#reduce() для создания объекта со значением общего свойства (day) в качестве ключей, а затем использовать Object.values() для возврата ожидаемого массива

const counts = data.reduce((a, {day, count}) => {
   a[day] = a[day] || {day, countSum:0}
   a[day].countSum += count
   return a
},{})

const res = Object.values(counts)

console.log(res)
<script>
const data = [
  {name: 'alice', colors: ['red', 'blue'], count: 1, day: '2018-11-12'},
  {name: 'alice', colors: ['blue'], count: 2, day: '2018-11-12'},
  {name: 'duke', colors: ['red', 'blue'], count: 1, day: '2018-12-12'},
  {name: 'bob', colors: ['blue'], count: 1, day: '2018-11-11'},
  {name: 'alice', colors: ['blue'], count: 1, day: '2018-11-10'},
  {name: 'carl', colors: ['blue'], count: 3, day: '2018-11-01'},
  {name: 'bob', colors: ['red'], count: 1, day: '2017-11-12'},
  {name: 'bob', colors: [], count: 1, day: '2018-11-12'},
  {name: 'bob', colors: ['red', 'blue', 'yellow'], count: 1, day: '2018-11-11'},
  {name: 'alice', colors: ['yellow'], count: 2, day: '2018-11-11'},
  {name: 'duke', colors: ['red', 'yellow'], count: 1, day: '2018-11-12'},
]
</script>
...