Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以对其进行分解?_Javascript_Destructuring - Fatal编程技术网

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