繁体   English   中英

ES6减少到新对象

[英]ES6 reduce to new object

我有一年中的所有日子如下:

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 = {"2019-01-01": {"planned": 3, "completed": 2}, "2019-02-02": {"planned": 0, "completed": 0} ...}

我知道这在某种程度上适用于减少,但我现在无法帮助自己。

在您的days数组中使用reduce 对于每一天,在tasks对象中找到一个条目,将此条目添加到累加器,否则返回默认条目。

这是Array.reduce()上MDN doc

 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); 

const taskNew = days.reduce((acc, day) => {
  if (!tasks[day]) {
    return {
      ...acc,
      [day]: {
        planned: 0,
        completed: 0
      }
    }
  }  
  return {
    ...acc,
    [day]: tasks[day]
  } 
}, {});

有关reduce的详细信息: https//developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/reduce

您可以减少创建新对象的days数组。 对于每一天,您将检查当天是否有任务并将它们合并到结果地图中,如果当天没有任务,则合并默认的空“指标”:

 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) 

您可以使用reducedays数组实际映射到tasks对象中的键。 在这里,我遍历每天都在days ,检查它是否在tasks对象。 如果是,我将当前day作为密钥及其关联对象从tasksnewTasks对象。 如果day不在对象中,那么我将默认的complete: 0planned: 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); 

克隆tasks tasks keys存储在变量中。 然后依次通过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) 

最短的方式:

{...days.reduce((obj,d)=>({...obj,[d]:{ planned: 0, completed: 0 }}),{}), ...tasks}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM