繁体   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