[英]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.