Lodash partialRight padStart映射产生错误结果

Lodash partialRight padStart map Gives Bad Result

本文关键字:错误 结果 映射 partialRight padStart Lodash      更新时间:2023-09-26

使用lodash(v4.6.1)时遇到了一个奇怪的情况,我将_.padStart_.partialRight函数传递到_.map回调中,结果很糟糕。

Repro:

_.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的错误/限制吗?或者有更好的方法吗?

经过一些研究,为了实现这一点,在不将_.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的能力和灵活性让我惊叹不已。