【问题标题】:Lodash partialRight padStart map Gives Bad ResultLodash partialRight padStart 地图给出了错误的结果
【发布时间】:2016-07-11 05:28:05
【问题描述】:

在使用 lodash (v4.6.1) 时遇到了一个奇怪的情况,我将 _.padStart_.partialRight 函数传递给 _.map 回调并得到 bum 结果。

复制:

_.padStart("0", 2, "0");
// "00"
var f = _.partialRight(_.padStart, 2, "0");
f("0");
// "00"
_.map(["0"], function(s) { return f(s); });
// ["00"]
_.map(["0"], f);
// ["0"]

在深入了解执行此操作的 lodash 代码之后,我们来到这里:

function arrayMap(array, iteratee) {
  var index = -1,
      length = array.length,
      result = Array(length);

  while (++index < length) {
    result[index] = iteratee(array[index], index, array);
  }
  return result;
}

此时iteratee 就是上面声明的f 函数。在不深入研究代码的情况下,我只能假设从_.partialRight 添加的参数被附加在该函数调用的任何和所有参数之后。

现在我们进入问题部分。这是 lodash 的错误/限制还是有更好的方法来做到这一点?

【问题讨论】:

    标签: javascript functional-programming lodash partial-application


    【解决方案1】:

    经过一番调查,看起来为了做到这一点,不将_.partialRight 生成的函数包装在一个函数中,是利用_.ary 函数来限制它将接受的参数。所以最终的结果应该是这样的:

    var f = _.ary(_.partialRight(_.padStart, 2, '0'), 1);
    var result = _.map(["0"], f);
    // result == ["00"]
    

    并进一步减少代码使用中的丑陋:

    _.mixin({
      "padStartTwoZeroes": _.ary(_.partialRight(_.padStart, 2, '0'), 1)
    });
    
    var numbers = [0, 5, 10];
    var paddedNumbersAsStrings = _.map(numbers, _.padStartTwoZeroes);
    

    但也许使用更优雅的命名或更通用的mapPadStart,您可以手动设置要填充的数字和字符。

    无论如何,lodash 的功能和灵活性总是让我惊叹。

    【讨论】:

    • 在找到你的这个之前,我已经问过a new question。我希望我能就您发现的限制原因得到答案。
    猜你喜欢
    • 2022-01-16
    • 2023-03-04
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 2019-03-24
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多