Lodash partialRight padStart map给出了糟糕的结果

时间:2016-03-23 18:48:18

标签: lodash

使用lodash(v4.6.1)遇到一种奇怪的情况,我将_.partialRight _.padStart函数传递给_.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的错误/限制还是有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

经过一些调查后,为了实现这一点,看起来没有将_.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从未停止以其能力和灵活性令我惊讶。