使用数组值进行嵌套过滤

时间:2021-06-28 10:40:31

标签: javascript lodash

我有一个嵌套数组对象

const product = [{
        ref_id: 'B123',
        items: [
          {
            name: 'Brush',
            ref_id: 'M1' 
          },
          {
            name: 'Paste',
            ref_id: 'M2' 
          }
        ]
      },
      {
        ref_id: 'B124',
        items: [
          {
            name: 'Apple',
            ref_id: 'M9' 
          },
          {
            name: 'Orange',
            ref_id: 'M3' 
          }
        ]
      },
      {
        ref_id: 'B113',
        items: [
          {
            name: 'Maggi',
            ref_id: 'M7' 
          },
          {
            name: 'Wai Wai',
            ref_id: 'M12' 
          }
        ]
      }
    ]

外面的 ref_id 是类别 id,里面的 ref_id 是产品 id。现在,我有两个数组 - 一个值是类别的 ref_id,另一个是产品的 ref_id。

const filteredCategories = ['B123'];
const filteredItems = ['M2', 'M9', 'M7']

我想过滤掉属于filteredCategories ref_id 和filteredItems ref_id 下的所有项目,它们可以是任何其他类别的一部分。此外,结果不应包含重复项。

我的解决方案

let filteredProducts = [];
      products.forEach(item => {
        if(_.includes(filteredCategories, item.ref_id)) {
          filteredProducts.push(...item.items);
        } else {
          const filterProductItems = _.filter(item.items, (productItem)=> _.includes(filteredItems, productItem.ref_id));
          if(filterProductItems) {
            filteredProducts.push(...filterProductItems);
          }
        }
      });

这是否可以以更好和优化的方式完成,因为项目列表可能非常大?

1 个答案:

答案 0 :(得分:0)

    @alia, I would suggest you use find method on product nested array object. Check for below code:

 useEffect(() => {
    getFilteredCategories()
  }, []);
    
      const filteredCategories = ['B123'];
      let filteredProducts = [];
      const getFilteredCategories = async () => {
        filteredCategories.map((id, index) => {
          const participants = product.find(o => o.ref_id === id);
          filteredProducts.push(participants)
          return filteredProducts;
        });
        console.log('filteredProducts', filteredProducts)
      }