Typescript: отфильтруйте массив, содержащий все элементы другого массива

#typescript

Вопрос:

У меня есть массив ниже, причем каждому модулю в массиве назначено много классов

 const modules = [
   {
      "moduleId":"AN-01",
      "assignClasses":[
         {
            "class":{
               "classId":"1GC1"
            }
         },
         {
            "class":{
               "classId":"1A1"
            }
         },
         {
            "class":{
               "classId":"1EM1"
            }
         }
      ]
   },
   {
      "moduleId":"CC-01",
      "assignClasses":[
         {
            "class":{
               "classId":"1A1"
            }
         },
         {
            "class":{
               "classId":"1EM1"
            }
         }
      ]
   },
   {
      "moduleId":"CH-01",
      "assignClasses":[
         {
            "class":{
               "classId":"1GC1"
            }
         },
         {
            "class":{
               "classId":"1EM1"
            }
         }
      ]
   }
]
 

Я хочу отфильтровать приведенный выше массив модулей, который содержит все элементы, находящиеся в массиве элементов.

 const elements = ["1GC1", "1EM1"];
 

Я попытался использовать приведенный ниже код, но я получаю только модуль CH-01, хотя он должен возвращать модули AN-01 и CH-01.

 let data = modules.filter(module => module.assignClasses.every(assign => elements.some(item => item == assign.class.classId)));
 

Ответ №1:

Попробуйте это:

 const modules = [
   {
      "moduleId":"AN-01",
      "assignClasses":[
         {
            "class":{
               "classId":"1GC1"
            }
         },
         {
            "class":{
               "classId":"1A1"
            }
         },
         {
            "class":{
               "classId":"1EM1"
            }
         }
      ]
   },
   {
      "moduleId":"CC-01",
      "assignClasses":[
         {
            "class":{
               "classId":"1A1"
            }
         },
         {
            "class":{
               "classId":"1EM1"
            }
         }
      ]
   },
   {
      "moduleId":"CH-01",
      "assignClasses":[
         {
            "class":{
               "classId":"1GC1"
            }
         },
         {
            "class":{
               "classId":"1EM1"
            }
         }
      ]
   }
]
const elements = ["1GC1", "1EM1"];

let data = modules.filter(module => {
  const moduleClasses = module.assignClasses.map(assign => assign.class.classId)
  return elements.every(e => moduleClasses.includes(e))
}) 

console.log(data) 

Ответ №2:

Вы можете попробовать это

 const result = modules.filter(module =>
    elements.every(el =>
    module.assignClasses.some(item => item.class.classId === el)));

console.log(result);