【问题标题】:JavaScript 1.6 Array.map() and Array.filter() not working with built in functions as argumentsJavaScript 1.6 Array.map() 和 Array.filter() 不能使用内置函数作为参数
【发布时间】:2010-04-15 18:01:56
【问题描述】:

这很好用:

["655971", "2343", "343"].map(function(x) { return parseInt(x) }) // [655971, 2343, 343]

但这不是:

["655971", "2343", "343"].map(parseInt) // [655971, NaN, NaN]

Array.filter() 也是如此

我在这里缺少什么?

【问题讨论】:

标签: javascript arrays


【解决方案1】:

这是因为map 向回调函数传递的参数不仅仅是数组项。你得到:

callback(item, index, array)

通常你的函数会忽略它不需要的参数。但是parseInt 接受可选的第二个参数:

parseInt(string, base)

对于第一个呼叫,baseindex 0。这没问题,因为 ECMAScript 定义 base=0 与省略参数相同,因此允许十进制、八进制或十六进制(在这种情况下使用十进制)。

对于第二项和第三项,base12。它尝试将数字解析为 base-1(不存在)或 base-2(二进制)。由于字符串中的第一个数字是这些基数中不存在的数字,因此您会得到 NaN

一般来说,没有基础的parseInt 无论如何都是非常值得怀疑的,所以你可能想要:

["655971", "2343", "343"].map(function(x) { return parseInt(x, 10) })

【讨论】:

  • 另一种选择(尽管语义不同)在某些情况下是使用Number 函数。当在没有 new 的情况下调用时,它会将其参数转换为一个数字,类似于一元 + 运算符。
  • (是的...Number+ 都可以,但他们不会确保它是整数。)
  • .map(function(x) { return +x; }。你也可以用Number 来做这件事,就像.map(Number) 一样,因为Number 函数不像parseInt 那样接受任何额外的参数。然而,这是假设 ECMAScript 永远不会添加任何更多可选参数(这是一个安全的假设吗?嗯)。顺便说一句,Number+ 都将接受十六进制字符串(但谢天谢地,不接受意外八进制)。
  • 只是个小问题,虽然 JavaScript 可能不支持它,但 base-1 确实存在。它被称为 unarry,例如数字 4 可以写成 1111.base-1
【解决方案2】:

问题在于map 期望回调应该是一个接受三个参数callbackfn(value, index, array) 的函数。

第二个参数与parseInt(string, radix) 函数的radix 参数冲突。

Map 对每个元素都像这样调用 parseInt:

parseInt("655971",0); // 655971
parseInt("2343", 1);  // NaN
parseInt("343", 2);   // NaN

第一个有效,因为如果基数未定义或为 0,则假定为 10。

【讨论】:

  • 希望我能给你们两个答案,但必须选择第一个。 :)
【解决方案3】:

Array.Filter 接受一个函数,该函数返回要评估的项目是否满足条件的信息。 IsNumeric 可以满足您的需求。

http://www.hunlock.com/blogs/Mastering_Javascript_Arrays

【讨论】:

    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 2022-09-25
    相关资源
    最近更新 更多