Javascript 基于Ramda的多准则过滤列表
我有一个汽车列表,我想根据一个过滤对象进行过滤,这些汽车:Javascript 基于Ramda的多准则过滤列表,javascript,arrays,filtering,ramda.js,Javascript,Arrays,Filtering,Ramda.js,我有一个汽车列表,我想根据一个过滤对象进行过滤,这些汽车: const cars = [ {original: {"make": "audi", "model": "a4"}}, {original: {"make": "bmw", "model": "m5"}}, {original: {"make&q
const cars = [
{original: {"make": "audi", "model": "a4"}},
{original: {"make": "bmw", "model": "m5"}},
{original: {"make": "mercedes", "model": "s"}},
{original: {"make": "audi", "model": "a6"}},
];
筛选器对象,对于同一属性可以有多个条件(这些条件应视为或筛选器)。本词典中的每个条目(“make”、“model”)都应视为和过滤器
const filterObject = {
"make": {
filters: [
{prop: "make", value: "audi"},
{prop: "make", value: "bmw"}
]
},
"model": {
filters: [
{prop: "model", value: "a6"}
]
}
}
因此,在这种情况下,我应该拿回奥迪-a6
。
有了拉姆达,我可以走到这一步:
filter(
where({
make: equals("audi"),
model: equals("a6")
}),
map(x => x.original, data)
)
这是可行的,但有几个问题:
filterObject
是动态组装的,所以我事先不知道过滤了哪些属性。我应该以某种方式将对象映射到where
,但是我被多个条件所困扰。如何使where
了解每个属性的多个谓词original
)中,因此在开始筛选之前,我映射数组以将相关部分提供给where
函数,因此最终返回该映射数组可能
where
不是正确的方法?R.where需要一个对象,该对象对您希望测试的每个属性都有一个谓词函数。要通过测试对象,需要满足所有谓词(和)
要测试当前对象的make
让我们说“audi`与一组选项(或)相对应,您可以使用R.includes
因此,第一步是创建一个where对象,其中每个谓词根据一个值数组检查当前对象的值
const{map,pipe,prop,pulk,includes,flip,其中}=R;
const createFilters=map(管道(
道具(“过滤器”),
拔毛(‘值’),
翻转(包括)
));
const cars=[{“原装”:{“制造”:“奥迪”,“车型”:“a4”},{“原装”:{“制造”:“宝马”,“车型”:“m5”},{“原装”:{“制造”:“梅赛德斯”,“车型”:“s”},{“原装”:{“制造”:“奥迪”,“车型”:“a6”};
const filterObject={“make”:{“filters”:[{“prop”:“make”,“value”:“audi”},{“prop”:“make”,“value”:“bmw”}]},“model”:{“filters”:[{“prop”:“model”,“value”:“a6”}}};
常量过滤器=创建过滤器(过滤器对象);
控制台日志(过滤器);
log(其中(过滤器,{“make”:“audi”,“model”:“a4”}))//false
log(其中(过滤器,{“make”:“audi”,“model”:“a6”}))//true
不客气:)