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

    不客气:)