Хотя вы можете деструктурировать это напрямую, через что-то вроде
const {
data: {
stats: {
home: {
teamStats: [{
miscellaneous: {
offensePlays: totalPlaysFor
}
}]
},
away: {
teamStats: [{
miscellaneous: {
offensePlays: totalPlaysAgainst
}
}]
}
}
}
} = res
const homeTeam = {totalPlaysFor, totalPlaysAgainst}
, которое выглядит довольно уродливо.
Независимо от того, думаете ли вы, что ваш код некрасив, я вижу гораздо более важную проблему с ним: он не работает, когда ни одно из этих свойств не существует. Чтобы решить эту проблему, вам может потребоваться функция, еще не вездесущая в языке, например, Необязательная цепочка , которая позволит избежать выдачи ошибок для вложенного пути, такого как 'data?.stats?.home?.teamStats?.0?.miscellaneous?.offensePlays'
, просто возвращая undefined
, если один из упомянутые узлы не существуют.
Эквивалентная функция доступна как функция во многих библиотеках. Подчеркнуть * property
, loda sh property
и Ramda ' s path
предлагают несколько разные варианты этого. (Отказ от ответственности: я автор Рамды.) Однако достаточно легко написать нашу собственную:
const getPath = (pathStr) => (obj) =>
pathStr .split ('.')
.reduce ((o, p) => (o || {}) [p], obj)
const res = {data: {stats: {home: {teamStats: [{miscellaneous: {offensePlays: "foo"}}]}, away: {teamStats: [{miscellaneous: {offensePlays: "bar"}}]}}}}
const homeTeam = {
totalPlaysFor: getPath ('data.stats.home.teamStats.0.miscellaneous.offensePlays') (res),
totalPlaysAgainst: getPath ('data.stats.away.teamStats.0.miscellaneous.offensePlays') (res)
}
console .log (homeTeam)
Обратите внимание, что в этой простой версии массив обозначен не как [0]
, а как .0
. Очевидно, мы могли бы сделать это более изощренным, если это необходимо.