Правильный способ обработки ошибок при работе с вложенными объектами и массивами - PullRequest
1 голос
/ 26 октября 2019

Моя структура данных (сжатая)

const data = {
  "cars": [
    {
      "name": "toyota",
      "sedan": {
        "2d": [
          {
            "name": "corolla",
            "year": 2020
          },
          {
            "name": "supra",
            "year": 1986
          }
        ]
      }
    }
  ]
};

Чтобы найти объект по имени, я бы сделал:

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

С помощью try / catch:

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 && ABCD
  • try {ABCD} catch {}
  • Какой-то другой подход?

Мое требование довольно простое.

  • Найти совпадение, если возможно
  • Приложение не должно ломаться ни при каких условиях.

Что я пытаюсь сделатьdo - избегать сотен && или `try {} catch {}` `повсюду в моем коде. Я могу создавать служебные методы, когда это возможно, но со сложными / вложенными данными, с которыми я имею дело, это часто невозможно.

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Если возможно, я бы, вероятно, сделал бы некоторую массивацию необработанных данных, чтобы получить их в форме, где вы можете отфильтровать на верхнем уровне и убедиться, что вы не имеете дело со всеми возможными нулями везде в вашем коде. Я также избавился бы от проверки на cars, гарантируя, что всегда есть пустой список автомобилей. Таким образом, фильтр и все остальное будет работать.

Я бы, наверное, стрелял, чтобы сгладить автомобильные объекты в отдельные машины со всеми подпорками;вот так:

const data = {
  "cars": [
    {
      "year": 2020,
      "make": "toyota",
      "model": "corolla",
      "type": "sedan",
      "doors" : 2
    },
    {
      "year": 1986,
      "make": "toyota",
      "model": "supra",
      "type": "sedan",
      "doors" : 2
    }
  ]
};

Я бы не использовал несколько цепных фильтров для этого, я просто показываю, насколько проще было бы фильтровать более напрямую и упростить все седаны, двухдверные седаны и т. д. ваш код и life :)

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);
0 голосов
/ 27 октября 2019

Использовать ли try/catch или добавлять в охраняющих условиях - вопрос мнений, хотя я чаще видел скрытые выражения.

Но нет никаких сомнений в том, что все мы будем поклонниками функции условного связывания (также: mdn ), которая в настоящее время находится на этапе 3.

Тогда ваш код будет выглядеть следующим образом:

const match = data.cars?.find(car => car.sedan)
              ?.sedan?.['2d']?.filter(car => car?.name === "corolla");

Если частые поиски во вложенном объекте, то вы могли бы подумать о том, чтобы сгладить структуру в массив не вложенных объектов.

Чтобы избежать сканирования всего массива, вы можете отсортировать этот массив по одному из его свойств объекта, что позволяет выполнять двоичный поиск. Вы можете даже добавить некоторые Map объекты как отдельные способы доступа к тем же данным, но по ключу. Это, очевидно, возвращает вас к большему количеству вложенности, но это будет дополнительная структура (не замена массива) для детализации ваших данных быстрее, чем путем фильтрации всей партии. Такая карта будет содержать для каждого ключа массив подходящих объектов (без копий, но те же ссылки на объекты, что и в основном массиве).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...