谓词角度 2 上的滤波器数组



我有一个object array,我想通过将其与谓词匹配来过滤数据。复杂性在于predicate的构造,在这种情况下,它类似于使用Map数据结构构建的query

这是我的对象array的样子:

var data = [
   {"id" : 1, "name": "bob", "address": "123 abc", "status": "active"},
   {"id" : 2, "name": "henry", "address": "123 def", "status": "inactive"},
   {"id" : 3, "name": "henry", "address": "123 hij", "status": "active"}
];

这是Map结构,从谓词应该构造的内容:

var map = new Map<string, any>();
map.set("name", ["henry", "bob"]);
map.set("status", "active");

在这种情况下,正确的输出应该是:

[{"id" : 3, "name": "henry", "address": "123 hij", "status": "active"}]

现在,我应该如何编写我的data.filter((item) => {...})例程,以便它动态构造predicate并筛选结果。我不想对property名称进行硬编码,因为它们可能是要过滤的任何一个属性。

其次,这个值是type any,这意味着它可以是一个stringarray或一个数字。谓词的计算结果与此类似:

data.filter((item) => 
{ item["name"] IS IN map.get("name").values[]
  && item["status"] IS EQUAL TO map.get("status").value)});

我不知道如何将Map对象展平为谓词,然后过滤必要的。任何提示或帮助都会非常有帮助。

非常粗糙和准备好,但像下面这样的东西可能会让你走上正确的轨道(适用于你的简单数据集(。

const predicate = item => {
  for (let [key, value] of map) {
    if (!item.hasOwnProperty(key)) return false;
    if (typeof value === 'number') {
        if (item[key] !== value) return false;
    }
    if (!value.includes(item[key])) return false;
  }
  return true;
};

最新更新