过滤数组时如何忽略一些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);
我在下面的代码中有一个数组 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);