[英]Proper way of handling errors when working with nested objects and arrays
我的數據結構(精簡)
const data = {
"cars": [
{
"name": "toyota",
"sedan": {
"2d": [
{
"name": "corolla",
"year": 2020
},
{
"name": "supra",
"year": 1986
}
]
}
}
]
};
要按名稱查找 object,我會這樣做:
const twoDcars = data.cars.reduce(car => car.sedan);
const match = twoDcars.sedan['2d'].filter(car => car.name === "corolla");
console.log(match); //[ { name: 'corolla', year: 2020 } ]
有條件檢查:
const twoDcars = data.cars && data.cars.reduce(car => car.sedan);
const match = twoDcars && twoDcars.sedan && twoDcars.sedan['2d'] && twoDcars.sedan['2d'].filter(car => car && car.name === "corolla");
console.log(match); //[ { name: 'corolla', year: 2020 } ]
使用嘗試/捕獲:
let match;
try {
match = data.cars.reduce(car => car.sedan).sedan['2d'].filter(car => car.name === "corolla");
} catch {}
console.log(match); //[ { name: 'corolla', year: 2020 } ]
我的問題是,這樣做的首選/行業標准是什么。
我的要求很簡單。
我想要做的是避免在我的代碼中到處出現數百個&&
或 `try{}catch{}``。 我可以盡可能創建實用程序方法,但是對於我正在處理的復雜/嵌套數據,這通常是不可能的。
如果可能的話,我可能會對原始數據進行一些處理,以使您可以在頂層過濾並確保您不會在代碼中處理所有可能的空值。 我還會通過確保始終有一個空的汽車清單來擺脫對cars
的檢查。 這樣,過濾器和 rest 就可以正常工作。
我可能會用所有道具將汽車物體壓平成單獨的汽車; 像這樣:
const data = {
"cars": [
{
"year": 2020,
"make": "toyota",
"model": "corolla",
"type": "sedan",
"doors" : 2
},
{
"year": 1986,
"make": "toyota",
"model": "supra",
"type": "sedan",
"doors" : 2
}
]
};
我不會為此使用多個鏈式過濾器,我只是展示更直接地過濾並獲得所有轎車、兩門轎車等會變得多么容易。簡化您的代碼和生活:)
let results = data
.cars
.filter(car => car.type === 'sedan') // all sedans
.filter(car => car.doors === 2) // two-door sedans
.filter(car => car.model === 'corolla'); // two-door corollas
當然,一旦你按摩它,你可以重新排列過濾器更直接; 像這樣(假設您知道卡羅拉是轎車並且您只想要兩門車型):
let results = data
.cars
.filter(car => car.model === 'corolla' && car.doors === 2);
是使用try/catch
還是添加保護條件,這是一個見仁見智的問題,盡管我經常看到受保護的表達式。
但毫無疑問,我們都將成為條件鏈接功能的粉絲(也: mdn ),目前處於第 3 階段。
然后您的代碼將如下所示:
const match = data.cars?.find(car => car.sedan)
?.sedan?.['2d']?.filter(car => car?.name === "corolla");
如果嵌套 object 中的搜索頻繁,則可以考慮將結構展平為非嵌套對象數組。
為避免掃描整個數組,您可以按其對象屬性之一對該數組進行排序,從而允許進行二分搜索。 您甚至可以添加一些Map
對象作為單獨的方式來訪問相同的數據,但通過鍵。 這顯然會讓您回到更多的嵌套,但這將是一個額外的結構(而不是替換數組),用於比過濾整個數據更快地深入到您的數據中。 這樣的 Map 將為每個鍵保存一個匹配對象的數組(沒有副本,但與主數組中的 object 引用相同)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.