我能用 JavaScript 过滤一个对象数组,使用子字符串吗?

4

我正在尝试使用多个不同的过滤器过滤对象数组。目前,这对于完全匹配的过滤可以工作,但是不能使用子字符串进行过滤。是否有一种简单地修改此过滤函数以返回具有部分匹配的所有值的方法?

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 - Washington Guedes
另外,您可能想使用.some()而不是.every() - Washington Guedes
2个回答

1
要对对象属性进行部分匹配,您需要检查该值是否包含筛选器列表中的至少一项。例如:
"Footbal".includes("Foot") || "Football".includes("Hockey") // true;

我们可以使用Array.some来进行断言:
return filters[eachKey].some(key => {
  return eachObj[eachKey].includes(key);
});

稍作更正:

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


0

使用 Array.reduce(),可以在每次迭代中实现 AND 操作

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

Filter only if the array is not empty.

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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接