[英]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.