Javascript 是否可以对其进行分解?
我不熟悉分解,需要帮助找到最佳解决方案。我有一个非常复杂的对象作为响应返回,并希望清理它。不做任何事情,它看起来是这样的:Javascript 是否可以对其进行分解?,javascript,destructuring,Javascript,Destructuring,我不熟悉分解,需要帮助找到最佳解决方案。我有一个非常复杂的对象作为响应返回,并希望清理它。不做任何事情,它看起来是这样的: const homeTeam = { totalPlaysFor: res.data.stats.home.teamStats[0].miscellaneous.offensePlays, totalPlaysAgainst: res.data.stats.away.teamStats[0].miscellaneous.offensePlays } 我知道我可以
const homeTeam = {
totalPlaysFor: res.data.stats.home.teamStats[0].miscellaneous.offensePlays,
totalPlaysAgainst: res.data.stats.away.teamStats[0].miscellaneous.offensePlays
}
我知道我可以做一些事情,比如:
const { offensePlays } = res.data.stats.home.teamStats[0].miscellaneous;
但是这只解决了其中一个的问题,而另一个仍然很长,很难阅读。您可以提前分解
stats
属性,然后生成一个helper函数,将.home
或.away
对象带到嵌套的。offensePlays
:
const { stats } = res.data;
const getOffPlays = obj => obj.teamStats[0].miscellaneous.offensePlays;
const homeTeam = {
totalPlaysFor: getOffPlays(stats.home),
totalPlaysAgainst: getOffPlays(stats.away)
};
如果没有独立的助手函数,您也可以通过
.map
ping属性数组(例如['totalPlaysFor','home',['totalPlaysAgainst','away']]
)来创建对象,并将其传递给对象。fromEntries
,但在我看来,这将大大降低可读性。您可以提前分解stats
属性,然后生成一个帮助函数,将.home
或.away
对象带到嵌套的。offensePlays
:
const { stats } = res.data;
const getOffPlays = obj => obj.teamStats[0].miscellaneous.offensePlays;
const homeTeam = {
totalPlaysFor: getOffPlays(stats.home),
totalPlaysAgainst: getOffPlays(stats.away)
};
如果没有独立的助手函数,您也可以通过
.map
ping属性数组(例如['totalPlaysFor','home',['totalPlaysAgainst','away']]
)来创建对象,并将其传递给对象。fromEntries
,但在我看来,这将大大降低可读性。您可以根据需要对结构进行任意分解
const homeTeam={
totalPlaysFor:res.data.stats.home.teamStats[0]。miscellaneous.offensePlays,
totalPlaysAgainst:res.data.stats.away.teamStats[0]。miscellaneous.offensePlays
}
您甚至可以在此处结合使用阵列分解/对象分解:
const[home]=res.data.stats.home.teamStats
const[away]=res.data.stats.away.teamStats
const{offensePlays:totalPlaysFor}=home.misscellaneous
const{offensePlays:totalPlaysAgainst}=away.miscellaneous
const hometeam={totalPlaysFor,totalPlaysAgainst}
或者,如果您想要更可重用的解决方案,可以使用参数分解:
const getTeam=(
{杂项:{进攻战术:全场战术},
{杂项:{进攻战术:全场战术}
) => ({
totalPlaysFor,
全剧
})
然后你可以像这样使用它:
const[home]=res.data.stats.home.teamStats
const[away]=res.data.stats.away.teamStats
const homeTeam=getTeam(主场、客场)
您可以任意分解结构
const homeTeam={
totalPlaysFor:res.data.stats.home.teamStats[0]。miscellaneous.offensePlays,
totalPlaysAgainst:res.data.stats.away.teamStats[0]。miscellaneous.offensePlays
}
您甚至可以在此处结合使用阵列分解/对象分解:
const[home]=res.data.stats.home.teamStats
const[away]=res.data.stats.away.teamStats
const{offensePlays:totalPlaysFor}=home.misscellaneous
const{offensePlays:totalPlaysAgainst}=away.miscellaneous
const hometeam={totalPlaysFor,totalPlaysAgainst}
或者,如果您想要更可重用的解决方案,可以使用参数分解:
const getTeam=(
{杂项:{进攻战术:全场战术},
{杂项:{进攻战术:全场战术}
) => ({
totalPlaysFor,
全剧
})
然后你可以像这样使用它:
const[home]=res.data.stats.home.teamStats
const[away]=res.data.stats.away.teamStats
const homeTeam=getTeam(主场、客场)
而您可以通过以下方式直接对其进行分解
const{
数据:{
统计数据:{
主页:{
团队统计:[{
杂项:{
进攻战术:全场战术
}
}]
},
离开:{
团队统计:[{
杂项:{
进攻战术:全场战术
}
}]
}
}
}
}=res
const homeTeam={totalPlaysFor,totalPlaysAgainst}
那感觉很难看
不管你是否认为你的代码很难看,我可以看到一个更重要的问题:当这些属性都不存在时,它就不工作了。为了解决这个问题,您可能需要一个在语言中还不普遍存在的特性,其中之一是避免为嵌套路径抛出错误,例如'data?.stats?.home?.teamStats?.0?.miscellaneous?.offensePlays'
,如果提到的节点之一不存在,只需返回undefined
许多库中都有一个等效功能作为函数提供。”s、s和s提供的版本略有不同。(免责声明:我是Ramda的作者。)然而,写我们自己的作品很容易:
const getPath=(pathStr)=>(obj)=>
路径str.split(“.”)
.reduce((o,p)=>(o |{})[p],obj)
const res={data:{stats:{home:{teamStats:[{杂项:{offensePlays:'foo'}}]},客场:{teamStats:[{杂项:{offensePlays:'bar'}]}}}}
康斯特主队={
totalPlaysFor:getPath('data.stats.home.teamStats.0.miscellaneous.offensePlays')(res),
totalPlaysAgainst:getPath('data.stats.away.teamStats.0.miscellaneous.offensePlays')(res)
}
log(homeTeam)
而您可以通过以下方式直接对其进行分解
const{
数据:{
统计数据:{
主页:{
团队统计:[{
杂项:{
进攻战术:全场战术
}
}]
},
离开:{
团队统计:[{
杂项:{
进攻战术:全场战术
}
}]
}
}
}
}=res
const homeTeam={totalPlaysFor,totalPlaysAgainst}
那感觉很难看
不管你是否认为你的代码很难看,我可以看到一个更重要的问题:当这些属性都不存在时,它就不工作了。要解决这个问题,您可能需要一个在该语言中尚未普遍存在的特性,其中之一就是av