我是函数式编程的新手,我试图重构我的代码,没有任何副作用。
let keywords = _.get(content, '[0].keywords', []);
keywords = keywords.slice(0, config.keywordLimit);
我正在使用lodash。我相信你可以把这两种方法联系起来,就像这样。
const keywords = _.get(content, '[0].keywords', []).slice(0, config.keywordLimit);
但我只是想知道在JavaScript中是否有更实用的方法吗?
答案 0 :(得分:2)
基本上,功能风格是关于构图的。这是一个示例:
var get = _.curry(_.flip(_.get), 3);
var slice = _.curry(_.flip(_.slice), 3);
var comp = function(f, g) {
return function(x) {
return f(g(x));
}
};
var config = {
keywordLimit: 2
};
var program = comp(
slice(config.keywordLimit, 0),
get([], 'x')
)
var x = program({
x: ['abc', 'qwe', 'sdf']
});
console.log(x);
<script src="https://raw.githubusercontent.com/lodash/lodash/4.17.2/dist/lodash.min.js"></script>
如果这个小提琴不起作用,这里是jsbin:http://jsbin.com/gicocivife/edit?js,console
注意丑陋的curry(flip(get))
和curry(flip(slise))
。问题是lodash中的函数有这样的参数顺序,阻止你组成。您的函数希望数据可以使用,对吧?因此,此数据的参数必须是最后一个。因此,您可以撰写功能。我建议看看Ramda。不仅从我的角度来看,这是一个很棒的FP库。这是用它写的相同例子。
var config = { keywordLimit: 2 };
var program = compose(
slice(0, config.keywordLimit),
view(lensProp('x'))
)
program({
x: ['abc', 'qwe', 'sdf']
});
问题是,默认情况下,函数是curry。因此,部分应用自然而然。它还有镜头,这是一个很棒的东西!