我有一个像这样的对象数组:
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;
}
感谢您的帮助!
莫夫
答案 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.gte
与level
的第二个参数。
第二行将给定的对象列表仅过滤为ratio
属性满足gteKeysFns
列表中任何函数的那些对象。