我有一个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
,这意味着它可以是一个string
、array
或一个数字。谓词的计算结果与此类似:
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;
};