具有用于分组的动态属性的嵌套javascript对象的扩展语法

具有用于分组的动态属性的嵌套javascript对象的扩展语法,javascript,ecmascript-6,spread-syntax,Javascript,Ecmascript 6,Spread Syntax,两者都返回错误TypeError:无法读取未定义的属性“1” 如何使用spread语法获得这样的分组结果 const data = [{year:2019,month:1,id:"xd1"}, {year:2019,month:1,id:"xd2"}, {year:2019,month:1,id:"xd4"}, {year:2019,month:2,id:"xd1"}, {year:2018,month:1,id:"rd3"}, {year:2018,month:2,id:"rd6"}

两者都返回错误TypeError:无法读取未定义的属性“1” 如何使用spread语法获得这样的分组结果

const data = [{year:2019,month:1,id:"xd1"},
 {year:2019,month:1,id:"xd2"},
 {year:2019,month:1,id:"xd4"},
 {year:2019,month:2,id:"xd1"},
 {year:2018,month:1,id:"rd3"},
 {year:2018,month:2,id:"rd6"},
 {year:2018,month:2,id:"rd7"}
]

const result = data.reduce((state,d)=>{
    return {
        ...state,
        [d.year]:{
            ...state[d.year],
            [d.month]:[
                ...state[d.year][d.month]
                ,d.id]
        }
    }
},{})

console.log(result);



const result = data.reduce((state,d)=>{
    return {
        ...state,
        [d.year]:{
            ...state[d.year],
            [d.month]:[].concat([state[d.year][d.month]],[d.id])
        }
    }
},{})

请考虑使用缩减和扩展语法,而不是链接其他方法,因为它实际上是一个更大的结构的一部分,其他的东西不会有帮助。 谢谢。 编辑:如评论中所述。我想明确地使用返回新对象或数组的spread操作符内联求解它。没有像lodash这样的额外库。

只需添加一些sh*t和棍棒:

const data=[{年份:2019,月份:1,id:xd1}, {年份:2019,月份:1,id:xd2}, {年份:2019,月份:1,id:xd4}, {年份:2019,月份:2,id:xd1}, {年份:2018,月份:1,id:rd3}, {年份:2018,月份:2,id:rd6}, {年份:2018,月份:2,id:rd7} ] const result=data.reducestate,d=>{ 返回{ 状态 [d.year]:{ …州[d.年], [d.month]:[ …州[d.年].{}[d.月].[], d、 [id] } } },{}
console.logresult;当状态为空时,不会有状态[d.year],因此状态[d.year][d.month]将是您看到的错误。@HereticsMonkey我认为这不是一个重复的问题。对象结构稍有不同,解决方案包含lodash而不是spread。更好地关注可读性,而不是在这种情况下使用spread,因为spread是hipster。不可读是一个新概念,js允许这样的语法真是太遗憾了that@bambam,这既是礼物也是诅咒。:-没错。这是一张回答实际问题的投票。下一次我会问spread是有用的、漂亮的还是时髦的,但现在只是-thanks@silverfighter,很乐意帮忙。
{'2019':{
   '1':["xd1","xd2","xd3"],
   '2':["xd1"]},
 '2018':{
   '1':["rd3"],
   '2':["rd6","rd7"]
 }

}