Javascript 双重排列问题-摆脱Object.assign()

Javascript 双重排列问题-摆脱Object.assign(),javascript,reactjs,ecmascript-6,ecmascript-next,Javascript,Reactjs,Ecmascript 6,Ecmascript Next,以下是我的reducer主体代码片段: const newState = { ...state, programs: { ...state.programs, ...Object.assign( {}, ...action.payload.map( (channelName) => ({

以下是我的reducer主体代码片段:

const newState = {
    ...state,
    programs: {
        ...state.programs,
        ...Object.assign(
            {},
            ...action.payload.map(
                (channelName) =>
                    ({
                        [channelName]: {
                            ...state.programs[channelName],
                            selected: true
                        }
                    })
            )
        )
    }            
}
return newState
是否有机会摆脱
对象。在这种情况下分配

对象.assign({},a)
分配给
{…a}
的经典建议在这种情况下不起作用,因为这里我们已经有了
…action.payload.map
,因此它将导致
。。。{…a}
它使spread生成类似数组的0,1,2键


有什么优雅的方法可以正确转换我的代码吗?

听说过
reduce

const action={
有效负载:['discoveryChannel']
}
常量状态={
计划:{
卡通网络:{
说明:“”,
时间:新日期()
},
发现频道:{
说明:“”,
时间:新日期()
}
}
}
常数newState={
……国家,
计划:{
…国家计划,
…action.payload.reduce(
(acc,channelName)=>{
acc[channelName]={
…state.programs[channelName],
所选:真
}
返回acc;
}, {})
}
}

console.log(newState)听说过
reduce

const action={
有效负载:['discoveryChannel']
}
常量状态={
计划:{
卡通网络:{
说明:“”,
时间:新日期()
},
发现频道:{
说明:“”,
时间:新日期()
}
}
}
常数newState={
……国家,
计划:{
…国家计划,
…action.payload.reduce(
(acc,channelName)=>{
acc[channelName]={
…state.programs[channelName],
所选:真
}
返回acc;
}, {})
}
}

console.log(newState)使用对象的另一个选项。fromEntries

const action={
有效负载:['discoveryChannel']
}
常量状态={
计划:{
卡通网络:{
说明:“”,
时间:新日期()
},
发现频道:{
说明:“”,
时间:新日期()
}
}
}
常数newState={
……国家,
计划:{
…国家计划,
…Object.fromEntries(
action.payload.map(
channelName=>([
channelName,{…state.programs[channelName],已选择:true}
])
)
)
}
}

console.log(newState)使用对象的另一个选项。fromEntries

const action={
有效负载:['discoveryChannel']
}
常量状态={
计划:{
卡通网络:{
说明:“”,
时间:新日期()
},
发现频道:{
说明:“”,
时间:新日期()
}
}
}
常数newState={
……国家,
计划:{
…国家计划,
…Object.fromEntries(
action.payload.map(
channelName=>([
channelName,{…state.programs[channelName],已选择:true}
])
)
)
}
}

console.log(newState)
可以在reduce循环中展开,但在本例中,
对象。assign({},…对象数组)
是优雅的解决方案。可以在reduce循环中展开,但在本例中,
对象。assign({},…对象数组)
是优雅的解决方案。完美的解决方案。现在我想知道reduce是否比Object.assign更具可读性,不过非常感谢。@EF如果您想让它更“可读”,请将reducer函数移出嵌套范围。完美的解决方案。现在我想知道reduce是否比Object.assign更具可读性,不过非常感谢。@EF如果您想让它更“可读”,请将reducer函数移出嵌套范围。非常感谢!这真是太美了。我在这附近徘徊,但是错过了通过从地图返回来生成条目对的最后一步…非常感谢!这真是太美了。我在这附近徘徊,但是错过了通过从映射返回条目对来生成条目对的最后一步。。。