使用Ramdas' propSatisfies'具有可变对象键名称的方法

时间:2016-03-19 07:42:24

标签: javascript ramda.js

我有一个像这样的对象数组:

    array = [{
                name: "Object A",
                ratio: {
                    up: 1,
                    mid: 2,
                    down: 1
                }
            },
            {
                name: "Object B",
                ratio: {
                    up: 3,
                    mid: 1,
                    down: 2
                }
            }];

这样的功能:

getGteLevelPerRatio = (list, keysTrue, level) => {...};
// "level" is of type number and can be 1,2 or 3
// "keysTrue" is an array of type String and can be any element of the power set of ["up", "mid", "down"], eg. ["up"] or ["mid", "down"] 

使用此功能,我希望每个对象至少有一个属性为" ratio"等于" keysTrue"的一个元素,如果它们相等,则属性的值应相等或+1到" level"。

示例:

keysTrue = [" up"," mid"]

level = 2

返回Object A和Object B,因为Object A的ratio.mid === 2,Object B的ratio.up === 3,等于level + 1.

如果我正确阅读了Ramda文档,那么Ramda' propSatisfied'方法(参见:Ramda docs - propSatisfied),但我不知道如何使用带有变量值的谓词。

这是我没有Ramda的相当低效的版本:

getGteLevelPerRatio = (list, keysTrue, level) => {
        arrayFiltered = [];
            array.forEach(entry => {
            keysTrue.forEach(keysTrueEntry => {
                for (key in entry.ratio) {
                    if (keysTrueEntry === key) {
                        if (level <= entry.ratio[key]) || level <= entry.ratio[key]) + 1) {
                          arrayFiltered.push(entry);                                
                          console.log(entry.name + " " + key + ": " + entry.ratio[key]);
                        }
                    }
                }
             return arrayFiltered;
}

感谢您的帮助!

莫夫

1 个答案:

答案 0 :(得分:3)

以下内容应该符合您的要求:

const getGteLevelPerRatio = (list, keysTrue, level) => {
  const gteKeysFns = R.map(R.propSatisfies(R.gte(R.__, level)), keysTrue);
  return R.filter(R.propSatisfies(R.anyPass(gteKeysFns), 'ratio'), list);
};

第一行映射到keysTrue列表,创建一个函数列表,如果它大于或等于给定的true,将为每个键返回level(nb we在此使用R.__占位符部分应用R.gtelevel的第二个参数。

第二行将给定的对象列表仅过滤为ratio属性满足gteKeysFns列表中任何函数的那些对象。

相关问题