簡體   English   中英

過濾數組時如何忽略某些對象

[英]How to ignore some objects when filter an array

我從 API 的響應中得到了下面代碼中的數組returnedDocs (通過let returnedDocs = result.application.modules.module.moduleItem;縮短),它的結構非常復雜。 一些嵌套對象是 arrays 一些值被放置在結構的幾層深處。

我使用過濾器方法只獲取那些獲得特定值的元素。

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

通常它工作正常,但在下面的示例中, repeatableGroupItem之一是具有兩個元素(圖像)的數組。

數組數組

由於過濾對象中存在意外數組,因此出現錯誤:

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)

過濾其他非數組元素時如何避免錯誤?

在這里您可以檢查數據 model,它是控制台記錄的: https://lucid-villani-539a6f.netlify.com/results

如果你只是想忽略 arrays,你可以簡單地測試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" ,無論它是單個 object還是這些對象的數組,您都可以使用[].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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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