我有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
,这意味着它可以是string
,array
或数字。谓词正在评估类似于此的内容:
data.filter((item) =>
{ item["name"] IS IN map.get("name").values[]
&& item["status"] IS EQUAL TO map.get("status").value)});
我无法弄清楚如何将Map
对象展平为谓词,然后过滤必要的内容。任何提示或帮助都会非常有用..
答案 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;
};