【问题标题】:How to do this in a functional way in JavaScript using Lodash?如何使用 Lodash 在 JavaScript 中以函数方式执行此操作?
【发布时间】:2016-12-14 18:46:00
【问题描述】:

我是函数式编程的新手,我正在尝试重构我的代码以使其没有副作用。

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

我正在使用 lodash。我相信您可以将这两种方法链接起来,然后变成这样。

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

但我只是想知道在 JavaScript 中是否有更实用的方式来执行此操作?

【问题讨论】:

  • 我就是这样做的。

标签: javascript functional-programming lodash


【解决方案1】:

基本上,功能风格是关于组合的。这是一个示例:

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']
});

问题是,函数默认是柯里化的。因此,部分应用自然而然。它还具有镜头,这是一个很棒的东西!

【讨论】:

    猜你喜欢
    • 2016-05-13
    • 2017-09-19
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2021-04-01
    • 2012-12-25
    • 1970-01-01
    • 2011-12-25
    相关资源
    最近更新 更多