【问题标题】:What does map(Number) do here?map(Number) 在这里做什么?
【发布时间】:2018-01-19 14:38:26
【问题描述】:
var strArr = ["[1,2,3,4]","[1,2,3,4"]];
var arr1 = strArr[0].match(/\d+/g).map(Number); 

我知道map() 方法创建了一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。这里 Number 是一个包装对象,我无法理解发生了什么。

我的理解是,如果我通过控制台记录删除 map 方法,我会得到一个字符串数组,而包含 map 方法,我会得到一个数字数组。我想知道 map 如何获取每个字符串并转换为号码。

【问题讨论】:

  • 顺便说一句,您可以在这种情况下使用Number,但不能使用更常见的parseIntmap 方法传递三个参数,parseInt 传递两个参数,如果你不知道你在看什么,结果会很混乱。
  • @JeremyJStarcher parseIntNumber 即使只有一个参数也不是一回事。
  • @PatrickRoberts 我知道,但我看到很多人尝试以同样的方式使用它们,我想我会阻止潜在的混乱来源。

标签: javascript arrays


【解决方案1】:
var arr1 = strArr[0].match(/\d+/g).map(Number);

等价于

var arr1 = strArr[0].match(/\d+/g).map((str, ind, arr) => Number(str, ind, arr));

Number 尽管传递了额外的参数仍然有效,原因是它忽略了除第一个参数之外的所有内容。您不能期望每个函数都相应地表现,因为并非所有函数都会忽略除第一个参数之外的所有内容,但在这种情况下,它是一种方便的快捷方式。另一个很好的例子是将真值和假值转换为布尔值:

var arrBool = arrAny.map(Boolean);

【讨论】:

  • 不错的答案。不知道这也适用于Boolean
【解决方案2】:
strArr[0] //selects the first string. "[1,2,3,4]"

.match(/\d+/g)  // give an array of all continuos strings of digits. ['1','2','3','4']

.map(Number)  // Calls Number on each value in the array (casting it to a number)
              // and returns the array of results. [1,2,3,4]
              //
              // Keep in mind Number(val) attempts to create a Number from 
              // what ever is passed to it. If it is a string itll
              // try to convert the string to a numerical value. 

它是一种解析包含数组文字的字符串的复杂方法。似乎是一种复杂的做法:

JSON.parse(strArr[0]) 

但如果没有更多上下文,我无法告诉你它是否是糟糕的编程,或者是否有充分的理由。

【讨论】:

    【解决方案3】:

    您正在传递Number 对象/函数并将与strArr 中的正则表达式匹配的单个事物转换为Number

    Number(x)一样,x是数组中的一个索引。

    例如,

    var num1 = "1";
    var num2 = "2";
    var result = Number(num1) + Number(num2); // This will work since they are both numbers now.
    

    因此,在数组中的 strings 上调用 map 只会将它们的特定索引转换为 Number 对象。

    详细了解 Numbers here

    【讨论】:

      【解决方案4】:

      其实数字是一个函数,很容易证明:

      typeof Number === 'function'; // true
      

      因此它可以在任何需要函数的情况下使用(当然它可以作为参数传递):

      Number("5") === 5; // true
      let arr = ["442", "452h", "424", "foo", "bar", "31", "35"];
      arr = arr.filter(x => !isNaN(Number(x))); // ["442", "424", "31", "35"]
      

      最后:

      const arr2 = arr.map(x => Number(x)); // [442, 424, 31, 35]
      const arr3 = arr.map(Number); // [442, 424, 31, 35] – the same result
      

      UPD:为了让它看起来更简单,让我们编写一个与内置 Number 函数完全相同的简单函数(将其他类型的值转换为数字类型):

      const toNumber = x => +x;
      // OR: function toNumber(x) { return +x; }
      
      const arr4 = arr.map(toNumber); // also [442, 424, 31, 35]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-28
        • 2012-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多