首页 > 解决方案 > 根据内部数组的值过滤对象数组

问题描述

我只想从数组中选择courses至少有一个fieldIds数组中具有 id 的字段的课程。下面是 thw 数组的格式:

courses = [
    {id: 5, name:"some name1", fields:[{id: 28, name:"field name"}, {id: 29, name:"field name2"}]},
    {id: 18, name:"some name2", fields:[{id: 11, name:"field name"}, {id: 28, name:"field name2"}]},
    {id: 7, name:"some name3", fields:[{id: 29, name:"field name"}, {id: 9, name:"field name2"}]}
]

fieldIds = [29, 9]

所以结果应该是:

courses = [
    {id: 5, name:"some name1", fields:[{id: 28, name:"field name"}, {id: 29, name:"field name2"}]},
    {id: 7, name:"some name3", fields:[{id: 29, name:"field name"}, {id: 9, name:"field name2"}]}
]

这是我尝试过的,我总是得到相同的数组,它没有任何改变

fieldIds.map(fieldId => {
    courses = courses.filter(course => course.fields.map(f => f.id == fieldId);
});

在尝试了这个问题的回答后编辑如下:

fieldIds.map(fieldId => {
    courses = courses.filter(course => course.fields.some(f => f.id == fielded))
}

如果 fieldIds 包含几个 ID,例如该函数返回课程属于所有字段。(我想提取至少有一个选定字段的课程)

标签: typescript

解决方案


这是工作解决方案:

const courses = [
    {id: 5, name:"some name1", fields:[{id: 28, name:"field name"}, {id: 29, name:"field name2"}]},
    {id: 18, name:"some name2", fields:[{id: 11, name:"field name"}, {id: 28, name:"field name2"}]},
    {id: 7, name:"some name3", fields:[{id: 29, name:"field name"}, {id: 9, name:"field name2"}]}
];

const fieldIds = [29, 9];

const filtered_courses = courses.filter(course => course.fields.some(field => fieldIds.includes(field.id)));

console.log(filtered_courses);

使用条件 ( some )过滤课程数组,验证字段数组中的至少一个元素与fieldIds数组的值相等。

PS:如果fields数组和fieldIds数组按 ASC 或 DESC 顺序排序,则“算法”要快得多,因为某些方法返回得更早。


推荐阅读