var strArr = ["[1,2,3,4]","[1,2,3,4"]];
var arr1 = strArr[0].match(/\d+/g).map(Number);
我知道map()
方法创建了一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。这里Number
是一个包装器对象,我无法理解发生了什么。
我理解的是,如果我控制日志删除map方法我得到一个字符串数组,而包括map方法我得到一个数字数组。我想知道map如何能够获取每个字符串并转换为号。
答案 0 :(得分: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])
但没有更多的上下文我无法告诉你它是否编程错误或是否有充分的理由。
答案 1 :(得分:1)
您正在传递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.
因此,在数组中的map
上调用strings
只会将特定索引转换为Number
对象。
详细了解Numbers here。
答案 2 :(得分: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);
答案 3 :(得分:1)
实际上 Number 是一个函数,可以很容易地证明:
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 函数完全相同(将其他类型的值转换为数字类型):< / p>
const toNumber = x => +x;
// OR: function toNumber(x) { return +x; }
const arr4 = arr.map(toNumber); // also [442, 424, 31, 35]