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