按值数组过滤对象数组中的嵌套数组

Fri*_*tra 2 javascript arrays object filter lodash

考虑下面的对象数组:

[
    {
        "guid": "j5Dc9Z",            
        "courses": [
            {
                "id": 1,
                "name": "foo",                    
            }
        ]
    },
    {
        "guid": "a5gdfS",
        "courses": [
            {
                "id": 2,
                "name": "bar",                    
            },
            {
                "id": 3,
                "name": "foo",                    
            },    
        ]
     },
     {
        "guid": "jHab6i",
        "courses": [
            {
                "id": 4,
                "name": "foobar",                    
            }   
        ]
     },  
     {...}    
]
Run Code Online (Sandbox Code Playgroud)

我正在尝试过滤对象数组,将嵌套courses数组中的ID 与下面的数组进行比较:

filter.courses = [1,3]
Run Code Online (Sandbox Code Playgroud)

以下行适用于数组中的第n个值:(通过/sf/answers/2894320901/

let fil = filter(this.results, { courses: [{ id: this.filter.courses[n] }]});
Run Code Online (Sandbox Code Playgroud)

但是,我希望做到这一点(下面的伪代码):

let fil = filter(this.results, { courses: [{ id: this.filter.courses }]});
Run Code Online (Sandbox Code Playgroud)

预期的输出将是包含任何课程ID元素的对象数组,在这种情况下:

[
    {
        "guid": "j5Dc9Z",            
        "courses": [
            {
                "id": 1,
                "name": "foo",                    
            }
        ]
    },
    {
        "guid": "a5gdfS",
        "courses": [
            {
                "id": 2,
                "name": "bar",                    
            },
            {
                "id": 3,
                "name": "foo",                    
            },    
        ]
     }   
]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,什么是最佳解决方案?避免循环将是一个好处。

31p*_*piy 7

如果您尝试过滤包含在中的课程ID的元素filter.courses,则可以使用Array#everyArray#includes为此:

const data = [{"guid":"j5Dc9Z","courses":[{"id":3,"name":"foo"}]},{"guid":"a5gdfS","courses":[{"id":1,"name":"bar"},{"id":3,"name":"foo"}]},{"guid":"jHab6i","courses":[{"id":7,"name":"foobar"}]}];
const courses = [1, 6, 3];

const r = data.filter(d => d.courses.every(c => courses.includes(c.id)));
console.log(r);
Run Code Online (Sandbox Code Playgroud)