【问题标题】:Why does filtering an array of objects with multiple criteria return an empty array?为什么过滤具有多个条件的对象数组会返回一个空数组?
【发布时间】:2019-04-29 15:43:18
【问题描述】:

假设我们有一个名为汽车的对象数组:

var cars = [

  {color: 'Black', horsePower: 120, type: 'suv'},
  {color: 'Red', horsePower: 90, type: 'cabriolet'},
  {color: 'Yellow', horsePower: 200, type: 'cabriolet'},
  {color: 'Black', horsePower: 350, type: 'suv'}

];

我想通过多个条件过滤这个数组。为此,我创建了一个过滤器对象。

var filters = {

  color: ['Black', 'Red'],
  horsePower: [90],
  type: []

};

我试过的是:

var output = cars.filter((elem) => {

  for (var key in filters) {

    if (filters[key].length == 0 || filters[key].indexOf(elem[key]) < 0) {

      return false;

    }

  }

  return true;

});

console.log(output);

我希望得到的结果是汽车的第二个索引,但我得到的是一个空数组。

我做错了什么?

【问题讨论】:

标签: javascript arrays filtering


【解决方案1】:

如果filter[key].length == 0return false,你可能想改变你的条件:

  if(filter[key].length && !filter[key].includes(elem[key]))

【讨论】:

    【解决方案2】:

    您的原始过滤器会查找 type 属性为空数组的汽车。你的汽车物品都没有。这应该可以。

    var cars = [
    
      {color: 'Black', horsePower: 120, type: 'suv'},
      {color: 'Red', horsePower: 90, type: 'cabriolet'},
      {color: 'Yellow', horsePower: 200, type: 'cabriolet'},
      {color: 'Black', horsePower: 350, type: 'suv'}
    
    ];
    
    var filters = {
    
      color: ['Black', 'Red'],
      horsePower: [90]
    
    };
    
    var output = cars.filter((elem) => {
    
      for (var key in filters) {
    
        if (filters[key].length == 0 || filters[key].indexOf(elem[key]) < 0) {
    
          return false;
    
        }
    
      }
    
      return true;
    
    });
    
    console.log(output);

    【讨论】:

      【解决方案3】:

      这就是我使用Array.prototype.filter 会做的事情:

      const cars = [
        {color: 'Black', horsePower: 120, type: 'suv'},
        {color: 'Red', horsePower: 90, type: 'cabriolet'},
        {color: 'Yellow', horsePower: 200, type: 'cabriolet'},
        {color: 'Black', horsePower: 350, type: 'suv'}
      ];
      
      const filters = {
        color: ['Black', 'Red'],
        horsePower: [90],
        type: []
      };
      
      let filteredCars = cars.filter(car => {
        for (const prop in filters) {
          if (filters[prop].length && !filters[prop].includes(car[prop])) return false;
        }
        return true;
      });
      
      console.log(filteredCars);

      【讨论】:

        猜你喜欢
        • 2021-07-05
        • 1970-01-01
        • 2021-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-04
        • 2020-05-23
        相关资源
        最近更新 更多