2015-10-30 134 views
1

我玩Ramda企图绕过功能JS我的头。下面的代码是产生一些随机搜索过滤器的对象,企图:RamdaJS:撰写对象产生相同的“随机”结果

var R = require('ramda'); 
var rWords = require('random-words'); 

var types = ['keyword', 'phrase', 'domain', 'person']; 
var operands = ['AND', 'OR', 'NOT']; 

var getRandom = (min=1, max=10) => Math.floor(Math.random() * (max - min)) + min; 
var sample = (arr) => arr[getRandom(0, arr.length)]; 
var chooseWords = (min=1, max=getRandom()) => rWords({min, max, join: ' '}); 
var chooseWordsFromType = (obj) => { 
    var max = obj.type === 'phrase' ? 10 : 1; 
    query = chooseWords(1, max); 
    return R.merge({query}, obj); 
}; 

var makeFilter = R.compose(
    chooseWordsFromType, 
    R.merge({operand: sample(operands)}), 
    R.merge({type: sample(types)}) 
); 

var initial = []; 
for(var i = 0; i < getRandom(); i++){ 
    initial.push(makeFilter({})); 
} 
console.log(initial); 

预期的结果应该是这样的

[ 
    {type: 'keyword', operand: 'AND', query:['something']}, 
    {type: 'domain', operand: 'AND', query:['something_else']} 
] 

的错误是,一切都在initial具有完全相同的操作数和类型;只有查询本身是不同的。我猜想它的电话sample,但我不知道为什么。

顺便说一句,我怎么可以重构chooseWordsFromType使之构成,而无需返回对象?或者我可以吗?

var makeFilter = R.compose(
    chooseWordsFromType, 
    R.merge({operand: sample(operands)}), 
    R.merge({type: sample(types)}) 
); 

做同样的事情,他说,从本质上讲,“呼sample,传递operands,使:

+0

这将是很容易解决,并讨论如果你能提供一个工作的例子。有可能你使用'random-words'会导致一个问题,并且删除这些代码会让你更容易理解你想要完成的事情。除了拉姆达之外,你能剥离外部依赖吗?并提供一个SO片段,JS Bin或类似的来演示这个问题? – Palpatim

回答

2

你会从这个代码?:

var defaultOperands = {operand: sample(operands)}; 
var defaultTypess = {type: sample(types)}; 

var makeFilter = R.compose(
    chooseWordsFromType, 
    R.merge({operand: defaultOperands}), 
    R.merge({type: defaultTypes}) 
); 

你的代码有什么期望一个对象出来,通过“操作””,键入做types和‘类型’类似的东西,然后创建一个makeFilter功能将合并的每个与你输入这些静态的对象,并返回传递一个到的结果。


一(未经测试)方法,使之动态是:

var makeFilter = R.compose(
    chooseWordsFromType, 
    obj => R.merge({operand: sample(operands)}, obj), 
    obj => R.merge({type: sample(types)}, obj) 
); 
+0

或。因为我的冗长的同事@ buzz-de-cafe说,“'makeFilter'在它的关闭中有'sample'中的随机数,'makeFilter'不会重新评估对'sample'的调用援引“。 –

+0

你的未经测试的方法就像一个魅力,我想我明白你说的样本中的随机数不被重新评估。还有一个问题:值得采用这种方法来建立一个对象,还是这种事情并不是真正的Ramda? –

+0

我不确定你的问题有很好的答案。拉姆达是实用功能的集合。它们的构建方式很容易组合,但没有任何特定领域适合或不适合。然而,你的主体和任何函数库之间有一个不匹配,那就是使用随机性。由于大多数FP系统都强调引用透明性,因此调用Random的任何函数都将严格禁止。不过,这应该是你自己的电话;它与你如何使用拉姆达无关。 –