在codewar上做一道难度最简单的题,也能得到以往没学过的知识点,这次的这道题,引出了几个知识点,其中一个是Array.from()。
题目是这样的:
意思是:给出一个非负的数字,返回一个独立的倒序数组。
我给出的解决方法是:
functiondigitize(n){
//code herevar arr2=[];
var arr = String(n).split("");
for(var i = 0,l = arr.length;i<l;i++){
arr2.push(parseInt(arr[i]));
}
return arr2.reverse();
}
自觉不是最好的方法,肯定有什么更好的。在得出最终答案之前,我还有个解答是:
return String(n).split("").reverse();
水平有限啊~还是提交了答案,照常参考下大佬们给出的答案,总结了一下,发现有两种答案是用不同的方法给出正确答案的。
1.
return
String
(n).split(
''
).map(
Number
).reverse() 或者
return
String
(n).split(
''
).reverse().map(
Number
)
2.
return
Array
.from(
String
(n),
Number
).reverse();
先来说说第二个答案:
我第一次知道Array.from()这个方法,所以特地去安利了一下,原话是这么说的:
Array.from()
方法可以将一个类数组对象或可迭代对象转换成真实的数组。
关于“类数组对象或可迭代对象”,它是这么描述的:
再说说语法:
我在Array.from()的语法中发现了一个熟悉的参数名称,mapFn。什么意思呢?mapFn可以在最后生成的数组上再执行一次map方法后再返回。
也就是说
Array.from(obj, mapFn, thisArg)
就相当于
Array.from(obj).map(mapFn, thisArg),
除非创建的不是可用的中间数组。
所以到最后来绕来绕去,还是回到了map方法上了。
那么map()又是什么呢?小白我又再一次安利了一下
仔细琢磨一下就能明白了,map()就是对数组中的每个元素都执行一次他的回调函数,并且返回每一个新的值再组合起来。
重点是要注意回调函数会被自动传入3个参数,但通常情况下,
map
方法中的
callback
函数只需要接受一个参数,就是正在被遍历的数组元素本身。但这并不意味着
map
只给
callback
传了一个参数。这个思维惯性可能会让我们犯一个很容易犯的错误。
例如:
// 下面的语句返回什么呢:["1","2","3"].map(parseInt);// 你可能觉的会是[1, 2, 3]// 但实际的结果是 [1, NaN, NaN]// 通常使用parseInt时,只需要传递一个参数.但实际上,parseInt可以有两个参数.第二个参数是进制数.可以通过语句"alert(parseInt.length)===2"来验证.// map方法在调用callback函数时,会给它传递三个参数:当前正在遍历的元素, 元素索引, 原数组本身.// 第三个参数parseInt会忽视, 但第二个参数不会,也就是说,parseInt把传过来的索引值当成进制数来使用.从而返回了NaN./*
//应该使用如下的用户函数returnInt
function returnInt(element){
return parseInt(element,10);
}
["1", "2", "3"].map(returnInt);
// 返回[1,2,3]
*/
弄明白这一点,你就能明白怎么用咯~反正我是弄明白了~