如何使用 Ramda 通过 "where" 比较测试对象中的属性值
How to compare values of properties in test object via "where" using Ramda
使用 Ramdajs 的 "where" 函数(参见:"where" - ramda docs)我想创建一个测试对象来比较它们之间的属性值。
示例:
let pred = R.where({
a: predTestA(...),
b: predTestB(...),
c: predTestC(...)
});
因此我想编写一个测试方法来比较 a、b 和 c 的值。
示例:
// Test if the value of "a" is higher or equal than all other values
let predTestA = (...) => {
if ((valA >= ValB) || (valA >= ValC)) {
return true
} else {
return false
}
}
问题:
- 如何访问属性的值?
- 您是否看到了完成对象值比较的更好方法?
感谢您的帮助!
手筒
Ramda 不提供。我相信它曾经有过,但很少使用。不过,编写自己的 where
版本会很容易:
const myWhere = curry(function (spec, testObj) {
for (var prop in spec) {
if (R.has(prop, spec) && !spec[prop](testObj[prop], testObj)) {
// ^^^^^^^
return false;
}
}
return true;
});
突出显示的位是与 Ramda 版本的唯一真正区别。
// Remember the triangle inequality from geometry class?
const triangular = myWhere({
a: (a, t) => a < t.b + t.c,
b: (b, t) => b < t.a + t.c,
c: (c, t) => c < t.a + t.b
});
triangular({a: 3, b: 4, c: 9}); //=> false
triangular({a: 3, b: 6, c: 8}); //=> true
triangular({a: 7, b: 1, c: 5}); //=> false
triangular({a: 2, b: 8, c: 4}); //=> false
triangular({a: 3, b: 4, c: 5}); //=> true
如果您认为这足够重要并且应该回到 Ramda 本身,请随时 raise an issue。
使用 Ramdajs 的 "where" 函数(参见:"where" - ramda docs)我想创建一个测试对象来比较它们之间的属性值。
示例:
let pred = R.where({
a: predTestA(...),
b: predTestB(...),
c: predTestC(...)
});
因此我想编写一个测试方法来比较 a、b 和 c 的值。
示例:
// Test if the value of "a" is higher or equal than all other values
let predTestA = (...) => {
if ((valA >= ValB) || (valA >= ValC)) {
return true
} else {
return false
}
}
问题:
- 如何访问属性的值?
- 您是否看到了完成对象值比较的更好方法?
感谢您的帮助!
手筒
Ramda 不提供。我相信它曾经有过,但很少使用。不过,编写自己的 where
版本会很容易:
const myWhere = curry(function (spec, testObj) {
for (var prop in spec) {
if (R.has(prop, spec) && !spec[prop](testObj[prop], testObj)) {
// ^^^^^^^
return false;
}
}
return true;
});
突出显示的位是与 Ramda 版本的唯一真正区别。
// Remember the triangle inequality from geometry class?
const triangular = myWhere({
a: (a, t) => a < t.b + t.c,
b: (b, t) => b < t.a + t.c,
c: (c, t) => c < t.a + t.b
});
triangular({a: 3, b: 4, c: 9}); //=> false
triangular({a: 3, b: 6, c: 8}); //=> true
triangular({a: 7, b: 1, c: 5}); //=> false
triangular({a: 2, b: 8, c: 4}); //=> false
triangular({a: 3, b: 4, c: 5}); //=> true
如果您认为这足够重要并且应该回到 Ramda 本身,请随时 raise an issue。