根据打字稿中的多个条件过滤对象数组

Filter an array of objects based on multiple conditions in typeScript

大家好,我有一组对象,例如

data = [
  { name: "Pork", category: "Food", subcategory: "Meat" },
  { name: "Pepper", category: "Food", subcategory: "Vegetables" },
  { name: "Beef", category: "Food", subcategory: "Meat" },
  { name: "banana", category: "Food", subcategory: "Fruit" }
];

这里需要根据过滤条件过滤data数组

{
   "filters":[
      {
         "filters":[
            {
               "field":"subcategory",
               "operator":"eq",
               "value":"Vegetables"
            }
         ],
         "logic":"or"
      },
      {
         "filters":[
            {
               "field":"name",
               "operator":"eq",
               "value":"Pepper"
            },
            {
               "field":"name",
               "operator":"eq",
               "value":"banana"
            }
         ],
         "logic":"or"
      }
   ],"logic":"and"
}

我可以简单地在 Kendo 中使用 process() 就像

kendo.data.Query.process(data, {
  filter: {
    logic: "and",
    filters: [{
      field: "subcategory",
      value: "Meat",
      operator: "eq"
    }],logic:"or"
  }
});

那么有没有其他方法可以在不使用 process() 的情况下像这样过滤?

此方法采用一个 filters 对象,该对象包含一个数组和一个逻辑部分作为条件的量词。

数组可以包含其他带有 filters 量词的对象,如 logic 或具有单个 属性 约束的对象,它必须与给定数据数组的项目匹配。

实际上只实现了一个运算符。

const
    operators = { eq: (a, b) => a === b },
    quantifiers = { and: 'every', or: 'some' },
    filter = ({ filters, logic }) => item => filters[quantifiers[logic]](f => 'filters' in f
        ? filter(f)(item)
        : operators[f.operator](item[f.field], f.value)
    ),
    filters = { filters: [{ filters: [{ field: "subcategory", operator: "eq", value: "Vegetables" }], logic: "or" }, { filters: [{ field: "name", operator: "eq", value: "Pepper" }, { field: "name", operator: "eq", value: "banana" }], logic: "or" }], logic: "and" },
    data = [{ name: "Pork", category: "Food", subcategory: "Meat" }, { name: "Pepper", category: "Food", subcategory: "Vegetables" }, { name: "Beef", category: "Food", subcategory: "Meat" }, { name: "banana", category: "Food", subcategory: "Fruit" }],
    result = data.filter(filter(filters));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }