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

Using Ramdas 'propSatisfies' Method with variable Object key name

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

    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"]

等级=2

returns对象A和对象B,因为对象A的ratio.mid === 2,对象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;
}

感谢您的帮助!

手筒

像下面这样的东西应该做你想要的:

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 列表,创建一个函数列表,如果每个键大于或等于给定的 [=],它将 return true 13=](n.b。我们在这里使用 R.__ 占位符来部分应用 R.gte 的第二个参数和 level)。

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