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;
  };
}

 

posted @ 2020-12-06 15:05  盲仔不瞎忙  阅读(129)  评论(0编辑  收藏  举报