使用另一个数组中的值过滤数组

时间:2017-03-22 04:03:47

标签: javascript arrays ecmascript-6

我有两个数组。一个拿着产品,另一个拿着过滤器(衬衫,裤子等)。所有产品都有类型属性,可以是衬衫,裤子等,与过滤器相对应。

我试图制作一个选择器,它会返回一个新数组,错过任何类型与任何过滤器匹配的产品。

export function filterProducts(products, filters) {
  return products.filter((item) => {
    return item.type === "hat";
  });
};

与此类似,除了明显检查每个过滤器,而不仅仅是"帽子"。我可以想到一些方法来实现这一点,但我试图找出更优雅的东西。我知道我必须循环一个循环,但我不能让它正常工作。 ES6 / lodash等都很好。

2 个答案:

答案 0 :(得分:1)

假设filters是包含您要查找的类型的字符串数组,您可以使用Array.prototype.some搜索filters数组来过滤它。



var products = [
    {
      name: 'Foo',
      type: 'hat'
    },
    {
      name: 'Bar',
      type: 'shirt'
    },
    {
      name: 'Baz',
      type: 'pants'
    },
    {
      name: 'Foobar',
      type: 'hat'
    },
    {
      name: 'Falsy Type',
      type: ''
    },
  ],
  filters = ['hat', 'pants', ''];

function filterProducts(products, filters) {
  return products.filter((item) => {
    return !filters.some(filter => item.type === filter);
  });
};

console.log(filterProducts(products, filters));




答案 1 :(得分:1)

另一种看法!

'use strict'
const filters = ['hat','shirt','pant'];
const products = [{
                    sku: 101,
                    type: 'hat'
                 }, {
                    sku: 102,
                    type: 'hat'
                 }, {
                    sku: 103,
                    type: 'shirt'
                 }, {
                    sku: 104,
                    type: 'pant'
                 }, {
                    sku: 101,
                    type: 'pant'
                 }, {
                    sku: 101,
                    type: 'shirt'
                 }]


const filterize = function (products, filters){
    let map = {};
    filters.forEach(function(filter){
        map[filter] = [];
    })
    products.forEach(function(product){
        if(typeof map[product.type] !== undefined){
            map[product.type].push(product);
        }
    })
    return map;
}


console.log(filterize(products, filters));

这将返回一个地图,其中过滤器作为键和值作为与过滤器对应的产品列表。以下示例输出:

{ hat: [ { sku: 101, type: 'hat' }, { sku: 102, type: 'hat' } ],
  shirt: [ { sku: 103, type: 'shirt' }, { sku: 101, type: 'shirt' } ],
  pant: [ { sku: 104, type: 'pant' }, { sku: 101, type: 'pant' } ] }