javascript - 如何在 JavaScript 中使用链而不应用反模式?

标签 javascript functional-programming prototype chain

如果您尝试在 JavaScript 上以函数式风格进行编程,您可能会发现传统的 fn(obj,params...) 形式很快就会变得不可读。

console.log(
    join(
        map(function(row){ return row.join(" "); },
            format(
                map(function(text){return align(text},
                    view),
                20))),
    "\n");

VS

view.map(function(text){return align(text)})
    .format(20)
    .map(function(row){return row.join(" ");})
    .join("\n")
    .log();

问题在于,后一种风格只能通过使用新功能扩展Object.prototype来实现,这在全局范围内被认为是邪恶。然而,它的可读性是如此之高,以至于我不得不继续这样做。有没有更好的方法来解决这个问题?

最佳答案

是的,有更好的方法来解决这个问题。下面是使用 lodash 的演示.

错误的方法:

import _ from "lodash";

_.chain([1, 2, 3])
  .map(x => [x, x*2])
  .flatten()
  .sort()
  .value();

更好的方法:

import map from "lodash/fp/map";
import flatten from "lodash/fp/flatten";
import sortBy from "lodash/fp/sortBy";
import flow from "lodash/fp/flow";

flow(
  map(x => [x, x*2]),
  flatten,
  sortBy(x => x) 
)([1,2,3]);

参见Why using _.chain is a mistake.以获得精彩而深入的解释。

关于javascript - 如何在 JavaScript 中使用链而不应用反模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15863759/

相关文章:

javascript - 需要javascript代码的解释

javascript - 如何通过 AJAX 调用从 PHP MySQL 数据获取 Highstock 中的数据

javascript - 实现加载 AngularJS 模板的自定义方式

python - 更好地使用 re 来避免重复传递

javascript - 无法将 parseInt 用作 ramdajs 的 ifElse 的 onTrue 或 onFalse 函数

javascript - 子类化 JavaScript 数组 - 构造函数参数未传递给数组

javascript - 增强 Object.prototype 会破坏 Dojo

javascript - 为什么 bind() 或 apply() 在这里不起作用,但 call() 起作用?

Javascript排序数组会改变窗口对象,但在迭代它时不会改变

functional-programming - Elixir 中是否有等效于 Haskell 的 init 函数?