let dates = {
'2018/07/25': [['r','red'], ['b','blue']],
'2018/07/26': [['a','apple'], ['o','orange']],
'2018/08/01': [['d','deer'], ['l','lion']]
}
预期的 newObject 是:
newObject = {
'2018/07':{
'2018/07/25': [['r','red'], ['b','blue']],
'2018/07/26': [['a','apple'], ['o','orange']]
},
'2018/08':{
'2018/08/01': [['d','deer'], ['l','lion']]
}
到目前为止我的代码:
let newObject = {};
Object.keys(dates).forEach((onedate, index) => {
let monthdate = onedate.slice(0,7)
newObject[monthdate] = {[onedate] : [...dates[onedate]]};
});
以上代码的输出:
newObject = {
'2018/07':{
'2018/07/26': [['a','apple'], ['o','orange']]
},
'2018/08':{
'2018/08/01': [['d','deer'], ['l','lion']]
}
最后一个日期覆盖同一个循环中的上层对象
是否可以在单个循环函数中执行此操作? 我必须使用 Sets 吗?
最佳答案
我会使用 Array.reduce
来构建最终对象。
var dates = {
'2018/07/25': [
['r', 'red'],
['b', 'blue']
],
'2018/07/26': [
['a', 'apple'],
['o', 'orange']
],
'2018/08/01': [
['d', 'deer'],
['l', 'lion']
]
}
var result = Object.keys(dates).reduce((mem, cur) => {
var key = cur.slice(0, 7);
mem[key] = { ...(mem[key] || {}),
[cur]: dates[cur]
};
return mem;
}, {});
console.log(result);
您的代码没有产生正确的结果,因为您在添加新属性时忘记合并属性。看,当您执行 { [onedate] : [...dates[onedate]] }
时,您需要像我在下面所做的那样合并旧条目。
newObject[monthdate] = {...newObject[monthdate], [onedate] : [...dates[onedate]]};
修复后的代码:
var dates = {
'2018/07/25': [
['r', 'red'],
['b', 'blue']
],
'2018/07/26': [
['a', 'apple'],
['o', 'orange']
],
'2018/08/01': [
['d', 'deer'],
['l', 'lion']
]
}
var newObject = {};
Object.keys(dates).forEach((onedate, index) => {
var monthdate = onedate.slice(0, 7)
newObject[monthdate] = { ...newObject[monthdate],
[onedate]: [...dates[onedate]]
};
});
console.log(newObject)
关于javascript - 从对象日期数组中分离出月份,并根据日期对应的月份进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52010918/