首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JSON数组上应用多个过滤器时,只有第一个过滤器有效

在JSON数组上应用多个过滤器时,只有第一个过滤器有效
EN

Stack Overflow用户
提问于 2018-05-18 16:04:35
回答 2查看 202关注 0票数 0

我正在监听用户输入的筛选器值,并将它们存储到一个数组中。filters = []我的json数据将根据filters数组的值进行筛选。*但是如果用户没有选中某些筛选器,这些筛选器有时可能为空。

代码语言:javascript
复制
filters = ["9999", "91", "2", "5920"]
array = [
        {carID: 38871, carNumber: 5918, dispatchStatus: 2, dataVersionNr: "AAAAAAhqD2Y=", postingID: 91,peratingCompanyID:2180
        },{carID: 38872, carNumber: 5919, dispatchStatus: 2, dataVersionNr: "AAAAAAhqD2Y=", postingID: 81,peratingCompanyID:9999
        },{carID: 38873, carNumber: 5920, dispatchStatus: 2, dataVersionNr: "AAAAAAhqD2Y=", postingID: 91,peratingCompanyID:9999
        }]

我想检查筛选器中是否有值,然后使用下面的链接获得的代码将所有筛选器应用于json

代码语言:javascript
复制
var filtered = array.filter(o => {
    if (filters[0] && o.peratingCompanyID== filters[0]) {
      console.log(filters);
      return true;
    }
    if (filters[1] && o.postingID == filters[1]) {
      return false;
    }
    if (filters[2] && o.dispatchStatus== filters[2]) {
      return false;
    }
    if (filters[3] && o.carNumber == filters[3]) {
      return false;
    }
    return true;
  });

我想返回满足上面过滤器的json,它是

代码语言:javascript
复制
[{carID: 38873, carNumber: 5920, dispatchStatus: 2, dataVersionNr: "AAAAAAhqD2Y=", postingID: 91,peratingCompanyID:9999}]

这里我漏掉了什么?

链接:Search for multiple filters in JSON using Javascript forEach and indexOf

Second example used

EN

回答 2

Stack Overflow用户

发布于 2018-05-18 16:17:51

我建议使用与过滤对象中的数据具有相同数据类型的所需键和值的对象进行过滤。

过滤器={ operatingCompanyID: 9999,postingID: 91,dispatchStatus: 2,carNumber: 5920 }

结果是一个新的数组,其中没有包含一些筛选器值的项。

使用Array#every进行过滤的工作方式类似于逻辑AND,其中所有项都必须匹配。

如果只有一项必须匹配,那么您可以使用Array#some,它的工作方式类似于逻辑OR。

代码语言:javascript
复制
var filters = filters = { operatingCompanyID: 9999, postingID: 91, dispatchStatus: 2, carNumber: 5920 },
    array = [{ carID: 38871, carNumber: 5918, dispatchStatus: 2, dataVersionNr: "AAAAAAhqD2Y=", postingID: 91, operatingCompanyID: 2180 }, { carID: 38872, carNumber: 5919, dispatchStatus: 2, dataVersionNr: "AAAAAAhqD2Y=", postingID: 81, operatingCompanyID: 9999 }, { carID: 38873, carNumber: 5920, dispatchStatus: 2, dataVersionNr: "AAAAAAhqD2Y=", postingID: 91, operatingCompanyID: 9999 }],
    filtered = array.filter(o => Object
        .entries(filters)
        .every(([key, value]) => o[key] === value)
    );

console.log(filtered);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 2
EN

Stack Overflow用户

发布于 2018-05-29 19:34:44

我已经设法使用promise解决了这个问题,如下所示

代码语言:javascript
复制
var filters = {
  operatingCompanyID: "",
  postingID: "",
  carNumber: "",
  carAndDriverAttributes: ""
};

要过滤的数组是var数组

代码语言:javascript
复制
 function getposting() {
    var resultposting;
    if (filters.postingID) {
      resultposting = array.filter(function(o) {
        return o.postingID === filters.postingID;
      });
    } else {
      resultposting = array;
    }

    return new Promise(function(res, rej) {
      res(resultposting);
    });
  }

  getposting()
.then(function(result) {
  var resultOcId;
  if (filters.operatingCompanyID) {
    resultOcId = result.filter(function(o) {
      return o.operatingCompanyID === filters.operatingCompanyID;
    });
  } else {
    resultOcId = result;
  }

  return resultOcId;
})
.then(function(result) {
  var resultCarNum;
  if (filters.carNumber) {
    resultCarNum = result.filter(function(o) {
      return o.carNumber === filters.carNumber;
    });
  } else {
    resultCarNum = result;
  }

  return resultCarNum;
})
.then(function(result) {
  var resultAttribute;
  if (filters.carAndDriverAttributes) {
    resultAttribute = result.filter(function(o) {
      if (o.carAndDriverAttributes !== null) {
        return (
          // o.carAndDriverAttributes.indexOf(filters.carAndDriverAttributes) >
          // -1
          o.carAndDriverAttributes === filters.carAndDriverAttributes
        );
      }
    });
  } else {
    resultAttribute = result;
  }

  return resultAttribute;
})
.then(function(result) {
  var resultP;
  if (filters.postingID) {
    resultP = result.filter(function(o) {
      return o.postingID === filters.postingID;
    });
  } else {
    resultP = result;
  }

  return resultP;
})
.then(function(result) {
  updateStatus(result, 0, "freecars");
});
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50406603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档