Lodash地图功能意外输出

时间:2016-11-11 20:43:12

标签: lodash

在chrome中使用lodash(截至今日)。

_.map("0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0".split(":"), parseInt);

我得到:

[0, NaN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

似乎是一项基本操作。

2 个答案:

答案 0 :(得分:4)

如果您已经在使用Lodash,那么将原生方法替换为Lodash通常会更安全。

在这种情况下,我会使用_.parseInt而不是parseInt,因为后者可能会产生意想不到的结果(就像这里的情况一样)。

以下按预期方式工作:

_.map("0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0".split(":"), _.parseInt);

如果您对为什么'vanilla'parseInt方法返回NaN感到好奇,我相信发生的事情如下:

  1. 当您使用_.map(collection, iteratee)时,iteratee实际上是通过三个参数调用的:(item, index, collection)。来源here
  2. 这里的问题是当你调用JavaScript的本地parseInt时,第二个参数是一个基数,它确定应该使用哪个基数来解析整数(二进制,八进制,十进制,十六进制等)。因为使用三个参数调用iteratee,这会弄乱你的基数并返回NaN。有关parseInt如何运作的解释,请参阅here
  3. Lodash _.parseInt()通过添加guard来避免此问题。通常可以安全地假设Lodash使用这样的警卫保护其方法,以确保您可以将它们用作其他Lodash方法中的迭代器。

答案 1 :(得分:1)

正如我在post中所评论的那样,您可以通过这种方式解决问题:

console.log(("0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0").split(":").map(Number));