【问题标题】:Can I filter an array of objects in javascript with a substring?我可以用子字符串过滤javascript中的对象数组吗?
【发布时间】:2020-05-15 23:07:22
【问题描述】:

我正在尝试使用多个不同的过滤器过滤一组对象。这目前适用于完全匹配,但不适用于使用子字符串进行过滤。有没有办法简单地修改这个过滤函数来返回所有部分匹配的值?

nestedFilter(data, filters) {

  let filterKeys = Object.keys(filters);
  return data.filter(function (eachObj) {
    return filterKeys.every(function (eachKey) {
      if (!filters[eachKey].length) {
        return true;
      }
      return filters[eachKey].includes(eachObj[eachKey]);
    });
  });
}

所以使用以下数据和过滤器:

data = [
    {
        "NAME": "Johnathon", 
        "AGE": "19 ",
        "GENDER": "M",
        "SPORT": "Hockey",
        "SCHOLARSHIP": "N"
    },
    {
        "NAME": "Jessica", 
        "AGE": "20",
        "GENDER": "F",
        "SPORT": "Football",
        "SCHOLARSHIP": "Y"
    },
    {
       "NAME": "Matty", 
       "AGE": "20",
       "GENDER": "NB",
       "SPORT": "Tennis",
       "SCHOLARSHIP": "Y"
   },
   {
      "NAME": "Amy", 
      "AGE": "20",
      "GENDER": "F",
      "SPORT": "Football",
      "SCHOLARSHIP": "N"
   }
]

filters = [
   {
      "NAME": [],
      "AGE": [],
      "GENDER": [],
      "SPORT": ["Foot", "Hockey"],
      "SCHOLARSHIP": []
   }
]

它应该返回 Johnathon、Jessica 和 Amy 对象。

(不同字段中的过滤器充当AND,同一字段中的过滤器充当OR)。

【问题讨论】:

  • .includes()更改为.indexOf() != -1
  • 另外,您可能需要.some() 而不是.every()

标签: javascript typescript filter angular8


【解决方案1】:

要对对象的属性使用部分匹配,您需要检查该值是否至少包含过滤器列表中的一项。例如:

"Footbal".includes("Foot") || "Football".includes("Hockey") // true;

我们可以使用Array.some 来做这个断言:

return filters[eachKey].some(key => {
  return eachObj[eachKey].includes(key);
});

一点修正:

filters 变量是一个数组,因此您可能希望将其转换为对象或使用filters[0] 运行nestedFilter 函数(指数组中的第一项)

【讨论】:

    【解决方案2】:

    使用Array.reduce(),每次迭代都可以实现AND

    使用Array.some(),可以为每个过滤器实现OR

    仅当数组不为空时过滤。

    var data = [
        { "NAME": "Johnathon", "AGE": "19 ", "GENDER": "M", "SPORT": "Hockey", "SCHOLARSHIP": "N" },
        { "NAME": "Jessica", "AGE": "20", "GENDER": "F", "SPORT": "Football", "SCHOLARSHIP": "Y" },
        { "NAME": "Matty", "AGE": "20", "GENDER": "NB", "SPORT": "Tennis", "SCHOLARSHIP": "Y" },
        { "NAME": "Amy", "AGE": "20", "GENDER": "F", "SPORT": "Football", "SCHOLARSHIP": "N" }
    ];
    
    var filters = {
          "NAME": ["Amy"],
          "AGE": [],
          "GENDER": [],
          "SPORT": ["Foot", "Hockey"],
          "SCHOLARSHIP": ["Y","N"]
       };
       
    var filterkeys = Object.keys(filters);
    var result = data.slice(0);
    filterkeys.forEach(function(filterkey){
        if(filters[filterkey].length)
        {
            result = result.reduce(function(acc, value){
                filters[filterkey].some(function(filtervalue){
                    return value[filterkey].indexOf(filtervalue)>-1;
                }) && acc.push(value);
                return acc;
            },[]);
        }
    });
    
    console.log(result)

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 2021-12-15
      • 1970-01-01
      • 2021-02-17
      • 2019-04-04
      • 2022-01-13
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多