1

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

    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 = [“上”,“中”]

级别 = 2

返回对象 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;
}

谢谢你的帮助!

莫夫

4

1 回答 1

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函数将返回(注意,我们在这里使用占位符来部分应用的第二个参数)。truelevelR.__R.gtelevel

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

于 2016-03-19T08:14:46.433 回答