使用带有可变对象键名的 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
列表中的任何函数的对象。
我有一个这样的对象数组:
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
列表中的任何函数的对象。