过滤数组时如何忽略一些objects

How to ignore some objects when filter an array

我在下面的代码中有一个数组 returnedDocs(通过 let returnedDocs = result.application.modules.module.moduleItem; 缩短),作为 API 的响应,它的结构非常复杂。一些嵌套 objects 是数组,一些值被放置在结构深处的几层。

我使用过滤方法只获取那些具有特定值的元素。

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

通常它工作正常,但在下面的示例中,repeatableGroupItem 之一是一个包含两个元素的数组(图像)。

由于过滤后的数组中存在意外数组,我遇到了一个错误 objects:

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)

在过滤其他 non-array 元素时如何避免错误?

在这里您可以检查数据模型,它是 console.log 的:https://lucid-villani-539a6f.netlify.com/results

如果你只想忽略数组,你可以简单地测试 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";
    }
  });

如果您要查找 "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);