如何使用Lodash在JavaScript中以功能方式执行此操作?

时间:2016-12-14 18:46:01

标签: javascript functional-programming lodash

我是函数式编程的新手,我试图重构我的代码,没有任何副作用。

let keywords = _.get(content, '[0].keywords', []);
keywords = keywords.slice(0, config.keywordLimit);

我正在使用lodash。我相信你可以把这两种方法联系起来,就像这样。

const keywords = _.get(content, '[0].keywords', []).slice(0, config.keywordLimit);

但我只是想知道在JavaScript中是否有更实用的方法吗?

1 个答案:

答案 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。因此,部分应用自然而然。它还有镜头,这是一个很棒的东西!