Найти, если массив объекта имеет элементы из другого массива, используя Lodash - PullRequest
0 голосов
/ 02 апреля 2019

Существует множество продуктов, каждый продукт имеет следующую структуру:

{
  id: 1,
  name: "product 1",
  materials: [
    {
      id: 1,
      name: "material 1"
    },
    {
      id: 2,
      name: "material 2"
    },
    {
      id: 3,
      name: "material 3"
    }
  ]
}

Каждый продукт имеет массив с различным количеством материалов.

Также имеется массив материалов.Идентификаторы, например [1, 4, 7, 2, 5].

Как отфильтровать массив товаров, чтобы оставить только товары, где материалы имеют идентификаторы, которые есть в массиве идентификаторов материалов?

Ответы [ 4 ]

1 голос
/ 02 апреля 2019

1001 * попробовать *

products.filter(p=> p.materials.some(m=> materialsIds.includes(m.id)));

let materialsIds = [1, 4, 7, 2, 5];
let products = [
{ id: 1, name: "product 1", materials: [{id: 1,name: "material 1"},{id: 2,name: "material 2"},{id: 3, name: "material 3"}]},

{ id: 2, name: "product 2", materials: [{id: 2, name: "material 2"}]},

{ id: 3, name: "product 3", materials: [{id: 3, name: "material 3"}]},

]

let r = products.filter(p=> p.materials.some(m=> materialsIds.includes(m.id)));

console.log('Filtered products ids', r.map(p=>p.id));
console.log('Filtered products', JSON.stringify(r));
0 голосов
/ 02 апреля 2019

const products = [
      {
        id: 1,
        name: 'product 1',
        materials: [
          {
            id: 1,
            name: 'material 1'
          },
          {
            id: 7,
            name: 'material 7'
          },
          {
            id: 5,
            name: 'material 5'
          }
        ]
      },
      {
        id: 2,
        name: 'product 2',
        materials: [
          {
            id: 1,
            name: 'material 1'
          },
          {
            id: 2,
            name: 'material 2'
          },
          {
            id: 3,
            name: 'material 3'
          }
        ]
      }
    ];
    const materials = [3, 4];
    console.log(
      products.filter(product => {
        for (let i = 0; i < product.materials.length; i++) {
          if (materials.includes(product.materials[i].id)) return true;
        }
      })
    );

Я бы сделал это так:

 products.filter(product => {
    for (let i = 0; i < product.materials.length; i++) {
      if (materials.includes(product.materials[i].id)) return true;
    }
  })
0 голосов
/ 02 апреля 2019

Вы можете сделать это:

import {intersection} from 'lodash'
const products = [...] 
const materialIds = [1,4,7,2,5]

// some function use es5+
const targetProducts = products.filter(p => intersection(p.materials.map(m => m.id), materialIds).length)

// use lodash only  import {filter, map, intersection} from 'lodash'
const targetProducts = filter(products, p => intersection(map(p.materials, 'id'), materialIds).length)
0 голосов
/ 02 апреля 2019

Вы можете сделать это, используя filter() some() и includes()

  • Используйте filter() в основном массиве продуктов
  • Затем используйте some() наmaterials объекта.
  • Проверьте, включает ли mats (идентификаторы материалов) id материала

let arr = [{ id: 1, name: "product 1", materials: [ { id: 1, name: "material 1" }, { id: 2, name: "material 2" }, { id: 3, name: "material 3" } ] },{ id: 2, name: "product 2", materials: [ { id: 11, name: "material 11" }, { id: 22, name: "material 22" }, { id: 33, name: "material 33" } ] } 

]
let mats = [1,5,6];

let res = arr.filter(x => x.materials.some(z=> mats.includes(z.id)));

console.log(res)
...