ES6 сводится к новому объекту - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть массив всех дней года, например, так:

const days = ["2019-01-01", "2019-01-02", "2019-01-03" ...]

И у меня есть объект, содержащий запланированные и выполненные задачи на определенные дни:

const tasks = {"2019-01-01": {"planned": 3, "completed": 2,}, "2019-01-03": { "planned": 1, "completed": 0 }, "2019-01-10": { "planned": 1, "completed": 1} ... }

Что яwant - это новый объект, который содержит для всех дней информацию о том, планировались и выполнялись задачи или нет, например:

const tasksNew = {"2019-01-01": {"planned": 3, "completed": 2}, "2019-02-02": {"planned": 0, "completed": 0} ...}

Я знаю, что это каким-то образом работает с системой Reduce, но сейчас я не могу помочь себе.

Ответы [ 6 ]

0 голосов
/ 12 февраля 2019

кратчайший путь:

{...days.reduce((obj,d)=>({...obj,[d]:{ planned: 0, completed: 0 }}),{}), ...tasks}
0 голосов
/ 10 февраля 2019

клон tasks.Сохраните keys из tasks в переменной.Затем выполните цикл days, проверьте, не keys не includes() day добавить ли объект newTasks

const days = ["2019-01-01", "2019-01-02", "2019-01-03"]

const tasks = {"2019-01-01": {"planned": 3, "completed": 2,}, "2019-01-03": { "planned": 1, "completed": 0 }, "2019-01-10": { "planned": 1, "completed": 1}}

const newTasks = JSON.parse(JSON.stringify(tasks));

const keys = Object.keys(tasks);
days.forEach(day => {
  if(!keys.includes(day))
   newTasks[day] = {completed:0,planned:0} 
   }
)
console.log(newTasks)
0 голосов
/ 10 февраля 2019

Используйте reduce в вашем массиве days.Для каждого дня, если в вашем объекте tasks есть запись, добавьте эту запись в аккумулятор, в противном случае верните запись по умолчанию.

Вот документ MDN для Array.reduce ().

const days = ["2019-01-01", "2019-01-02", "2019-01-03"];
const tasks = {"2019-01-01": {"planned": 3, "completed": 2,}, "2019-01-03": { "planned": 1, "completed": 0 }, "2019-01-10": { "planned": 1, "completed": 1} };

const tasksNew = days.reduce((accum, day) => {
  accum[day] = tasks[day] ? tasks[day] : { planned: 0, completed: 0 };
  return accum;
}, {});

console.log(tasksNew);
0 голосов
/ 10 февраля 2019

Вы можете уменьшить массив дней, создав новый объект.Для каждого дня вы будете проверять, есть ли задачи на этот день и объединять их с вашей картой результатов, если нет задач на этот день, объединять пустой «индикатор» по умолчанию:

const days = [
  "2019-01-01", 
  "2019-01-02", 
  "2019-01-03", 
  "2019-01-04",
  "2019-01-07",
  "2019-01-08",
  "2019-01-09",
  "2019-01-10"
]

const DEFAULT = { "planned": 0, "completed": 0 } 

const tasks = {
  "2019-01-01": {"planned": 3, "completed": 2,}, 
  "2019-01-03": { "planned": 1, "completed": 0 }, 
  "2019-01-10": { "planned": 1, "completed": 1 }
}

const result = days.reduce(
  (map, day) =>
    Object.assign({}, map, { [day]: tasks[day] ? tasks[day] : DEFAULT }),
  {}
)

console.log(result)
0 голосов
/ 10 февраля 2019

Вы можете использовать reduce для сопоставления массива days с ключами в объекте tasks.Здесь я повторяю каждый день в days, проверяю, находится ли он в tasks объекте.Если это так, я добавляю текущий day в качестве ключа и связанный с ним объект из tasks к newTasks объекту.Если day отсутствует в объекте, тогда я добавлю значения по умолчанию complete: 0 и planned: 0 в добавляемый массив:

const days = ["2019-01-01", "2019-01-02", "2019-01-03"],
tasks = {
  "2019-01-01": {
    "planned": 3,
    "completed": 2,
  },
  "2019-01-03": {
    "planned": 1,
    "completed": 0
  },
  "2019-01-10": {
    "planned": 1,
    "completed": 1
  }
},

newTasks = days.reduce((acc, day) => 
                   day in tasks ? 
                   {...acc, [day]: tasks[day]} : 
                   {...acc, [day]: {planned: 0, complete: 0}
                 }, {});

console.log(newTasks);
0 голосов
/ 10 февраля 2019
const taskNew = days.reduce((acc, day) => {
  if (!tasks[day]) {
    return {
      ...acc,
      [day]: {
        planned: 0,
        completed: 0
      }
    }
  }  
  return {
    ...acc,
    [day]: tasks[day]
  } 
}, {});

для подробностей о снижении: https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/reduce

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