Использование JavaScript для включения суммы значений полей в группу объектов - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть объект, полный tasks, сгруппированных по дням.Я также хотел бы добавить поле time каждой задачи, чтобы получить общее время для каждого дня, и включить его в объект.

Чтобы перейти от этого:

{'Monday': [
  {
    task: 'Do the dishes',
    time: 15
  },
  {
    task: 'Walk the dog',
    time: 20
  }
],
'Tuesday': [
  {
    task: 'Clean house',
    time: 5
  },
  {
    task: 'Do homework',
    time: 10
  }
  ]
}

К этому:

{'Monday': {
  tasks: [
    {
      task: 'Do the dishes',
      time: 15
    },
    {
      task: 'Walk the dog',
      time: 20
    }
  ],
  totalTime: 35
},
'Tuesday': {
  tasks: [
    {
      task: 'Clean house',
      time: 5
    },
    {
      task: 'Do homework',
      time: 10
    }
  ],
  totalTime: 15
}

Ответы [ 2 ]

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

Вы можете использовать lodash _.mapValues() для итерации групп и _.sumBy() для получения общего времени:

const obj = { 'Monday': [{ task: 'Do the dishes', time: 15 }, { task: 'Walk the dog', time: 20 } ], 'Tuesday': [{ task: 'Clean house', time: 5 }, { task: 'Do homework', time: 10 } ] }

const result = _.mapValues(obj, tasks => ({
  tasks,
  totalTime: _.sumBy(tasks, 'time')
}))

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 02 декабря 2018

Вы можете сделать это без lodash с простым JS (ES6, если вам нужны функции со стрелками).Это в значительной степени просто Array.reduce и Object.entries:

const obj = { 'Monday': [{ task: 'Do the dishes', time: 15 }, { task: 'Walk the dog', time: 20 } ], 'Tuesday': [{ task: 'Clean house', time: 5 }, { task: 'Do homework', time: 10 } ] }

const result = Object.entries(obj).reduce((r,[k,v]) => {
  r[k] = ({tasks: v, totalTime: v.reduce((a,b) => (a.time || a) + b.time)})
  return r
}, {})

console.log(result)
...