JavaScript--map()&reduce()
map()
由于map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果
比如我们有一个函数f(x)=x2,要把这个函数作用在一个数组
'use strict'; function pow(x) { return x * x; } var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; var results = arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81] console.log(results);
把Array的所有数字转为字符串:
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9']
错误用法:
'use strict'; var arr = ['1', '2', '3']; var r; r = arr.map(parseInt);
parseInt函数默认传递两个参数:
1,需要转换成数字的字符串;
2,基数(转换成的数字是以什么进制显示,例如2,就是2进制,默认或者等于0,为十进制显示,小于2或者大于36,parseInt()返回NaN).
这样就很好理解这道题出的问题了。
map(),参数为一个函数,这个函数默认参数有三个,1:元素值 2:元素值的下标 3:调用者本身(在这里是arr这个数组)。
正确用法:
r = arr.map(function(x){
return parseInt(x)
});
reduce()
格式:arr.reduce(callback[, initialValue])
- callback (执行数组中每个值的函数,包含四个参数)
- previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
- currentValue (数组中当前被处理的元素)
- index (当前元素在数组中的索引)
- array (调用 reduce 的数组)
- initialValue (作为第一次调用 callback 的第一个参数。)
Array的reduce()把一个函数作用在Array上,这个函数必须接收两个参数,reduce()把结果继续和序列的下一个元素做累积计算
比方说对一个Array求和:
var arr = [1, 3, 5, 7, 9]; arr.reduce(function (x, y) { return x + y; }); // 25
要把[1, 3, 5, 7, 9]变换成整数13579:
var arr = [1, 3, 5, 7, 9]; arr.reduce(function (x, y) { return x * 10 + y; }); // 13579
实现一个string2int()函数:
arr.split('').map(function (x){ return +x;}).reduce(function (x,y){return x * 10 + y;});
JavaScript中的‘-’号有一个隐式转换 字符串减去0会把字符串默认转换成数字,这也算个小技巧吧 +号的会把数字默认转换成字符串再进行连接
reduce源码
if (typeof Array.prototype.reduce != "function") { Array.prototype.reduce = function (callback, initialValue ) { var previous = initialValue, k = 0, length = this.length; if (typeof initialValue === "undefined") { previous = this[0]; k = 1; } if (typeof callback === "function") { for (k; k < length; k++) { this.hasOwnProperty(k) && (previous = callback(previous, this[k], k, this)); } } return previous; }; }