[英]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
對象中找到一個條目,將此條目添加到累加器,否則返回默認條目。
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)
您可以使用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);
克隆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.