簡體   English   中英

使用嵌套對象和 arrays 時處理錯誤的正確方法

[英]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 } ]

我的問題是,這樣做的首選/行業標准是什么。

  • A && AB && ABC && ABC.D
  • 試試 {ABC.D} 捕捉{}
  • 其他一些方法?

我的要求很簡單。

  • 如果可能,找到匹配項
  • 應用程序不應在任何情況下中斷。

我想要做的是避免在我的代碼中到處出現數百個&&或 `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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM