0

如果您尝试在 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用新功能扩展来实现,这在全球范围内被认为是邪恶的。然而,可读性非常好,以至于我被提示继续做下去。有没有更好的方法来解决这个问题?

4

3 回答 3

2

是的,有更好的方法来解决问题。下面是使用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]);

请参阅为什么使用_.chain是错误的。以获得精彩而深入的解释。

于 2016-09-15T23:00:54.597 回答
1

一种常见的“单子”方法是将操作数包装到您自己的对象中,在该对象上调用一系列方法,然后将纯值提取回来。underscore.js文档中的示例:

var youngest = _.chain(stooges)
  .sortBy(function(stooge){ return stooge.age; })
  .map(function(stooge){ return stooge.name + ' is ' + stooge.age; })
  .first()
  .value();
于 2013-04-07T15:21:42.857 回答
1

基本模式是

  1. 创建一个构造函数,将对象的状态存储为属性this
  2. 将可链接的方法添加到构造函数的原型中。在这些函数的主体中,更改附加到的对象的状态this,然后返回this
  3. 提供一种在链末尾使用的方法,将自定义可链接对象转换为原始数组或任何不可链接的模拟。

http://jsfiddle.net/XjRrn/是一个工作示例:

function ChainableArray(rawArray) {
     this._array = rawArray || [];
};
ChainableArray.prototype.map = function(fn) {
    this._array = _.map(this._array, fn);
    return this;
};
ChainableArray.prototype.incr = function(amount) {
    this._array = _.map(this._array, function (item) {return item + amount;});
    return this;
};
ChainableArray.prototype.toArray = function () {
    return _.clone(this._array);
};

来自 mongoose.js 库的 Query 对象是一个很好的案例研究可供参考。

于 2013-04-07T15:22:38.233 回答