Как игнорировать некоторые объекты при фильтрации массива - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть массив returnedDocs в приведенном ниже коде (сокращен до let returnedDocs = result.application.modules.module.moduleItem;), который я получил в ответ от API, его структура довольно сложна.Некоторые вложенные объекты являются массивами, некоторые значения размещены на глубине структуры на несколько уровней.

Я использую метод фильтра, чтобы получить только те элементы, которые получили определенное значение.

          let toFilterSix = returnedDocs.filter(
            o =>
              o.repeatableGroup.repeatableGroupItem.vocabularyReference
                .vocabularyReferenceItem.formattedValue._text === "Abdomen"
          );
          this.filterArray6 = toFilterSix;

Обычно это работает нормально, нов приведенном ниже примере один из repeatableGroupItem - это массив с двумя элементами (изображение).

arrayInArray

Я получил ошибку из-за того, что в отфильтрованных объектах есть неожиданный массив:

Results.vue?82a0:202 Uncaught (in promise) TypeError: Cannot read property 'vocabularyReferenceItem' of undefined
    at eval (Results.vue?82a0:202)
    at Array.filter (<anonymous>)
    at eval (Results.vue?82a0:201)

Как избежать ошибки при фильтрации других элементов, не являющихся массивами?

Здесь вы можете изучить модель данных, это console.log'ed: https://lucid -villani-539a6f.netlify.com / результаты

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Если вы просто хотите игнорировать массивы, вы можете просто проверить, имеет ли repeatableGroup свойство vocabularyReferences.

let toFilterSix = returnedDocs.filter(
  o =>
  o.repeatableGroup.repeatableGroupItem.vocabularyReference &&
  o.repeatableGroup.repeatableGroupItem.vocabularyReference.vocabularyReferenceItem.formattedValue._text === "Abdomen"
);

Если вы также хотите искать в массиве, вы можете использоватьif оператор для поиска в массиве.

let toFilterSix = returnedDocs.filter(
  o => {
    if (Array.isArray(o.repeatableGroup.repeatableGroupItem)) {
      return o.repeatableGroup.repeatableGroupItem.some(el => el.vocabularyReference.vocabularyReferenceItem.formattedValue._text === "Abdomen");
    } else {
      return o.repeatableGroup.repeatableGroupItem.vocabularyReference.vocabularyReferenceItem.formattedValue._text === "Abdomen";
    }
  });
0 голосов
/ 19 сентября 2019

Если вы пытаетесь найти "Abdomen" независимо от того, является ли он единственным объектом или массивом этих объектов, вы можете использовать [].concat(repeatableGroupItem).Это позволяет вам безопасно предполагать, что вы имеете дело с массивом, а не обрабатывать каждый случай отдельно.

Оттуда вы можете использовать .some(), чтобы определить, существует ли "Abdomen" в каком-либо из элементов.

// This array contains 4 objects... 
//   1: repeatableGroupItem as single object, containing "Abdomen"
//   2: repeatableGroupItem as array of objects, containing "Abdomen"
//   3: repeatableGroupItem as single object, without "Abdomen"
//   4: repeatableGroupItem as array of objects, without "Abdomen"
const returnedDocs = [{ repeatableGroup: { repeatableGroupItem: { vocabularyReference: { vocabularyReferenceItem: { formattedValue: { _text: "Abdomen" } } } } } }, { repeatableGroup: { repeatableGroupItem: [{ vocabularyReference: { vocabularyReferenceItem: { formattedValue: { _text: "Abdomen" } } } }, { vocabularyReference: { vocabularyReferenceItem: { formattedValue: { _text: "Abdomen" } } } } ] } }, { repeatableGroup: { repeatableGroupItem: { vocabularyReference: { vocabularyReferenceItem: { formattedValue: { _text: "Not Abdomen" } } } } } }, { repeatableGroup: { repeatableGroupItem: [{ vocabularyReference: { vocabularyReferenceItem: { formattedValue: { _text: "Not Abdomen" } } } }, { vocabularyReference: { vocabularyReferenceItem: { formattedValue: { _text: "Not Abdomen" } } } } ] } }];

const result = returnedDocs.filter(o => {
  const item = [].concat(o.repeatableGroup.repeatableGroupItem);
  return item.some(i => i.vocabularyReference.vocabularyReferenceItem.formattedValue._text === "Abdomen");
});

//Logs items 1 and 2
console.log(result);
...