簡體   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