在谓词角度2上过滤数组

时间:2017-02-08 22:27:16

标签: javascript arrays angular typescript

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

以下是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对象展平为谓词,然后过滤必要的内容。任何提示或帮助都会非常有用..

1 个答案:

答案 0 :(得分:1)

非常粗糙且准备就绪,但下面的内容可能会让您走上正确的轨道(适用于您的简单数据集)。

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;
};