前端面试题之reduce实现map

reduce函数

1.计算数组的总和

 var num = [1, 2, 3, 4, 5]
 var res = num.reduce((total, num) => total + num, 0)
 console.log(res)

2.合并二维数组

var  oldArray = [[0, 1], [2, 3], [4, 5]]
newArray = oldArray.reduce((a, b) => a.concat(b), [])
console.log(newArray)

3.统计一个数组中不重复单词数

var arr = ['taylor', 'swift', 'lenka', 'kripac', 'swift','lenka','kripac',]

// 不使用reduce
// function CountNumberNoRepeated(array) {
//   let obj = {}
//   for(let item of array) {
//     obj[item] = (obj[item] + 1) || 1
//   }
//   return obj
// }

// console.log(CountNumberNoRepeated(arr))

// 使用reduce
function CountNumberNoRepeated(array) {
  return array.reduce(
    (prev, next) => {
      prev[next] = (prev[next] + 1) || 1
      return prev
    }, {})
}
console.log(CountNumberNoRepeated(arr))

4.对reduce的理解

reduce(callback,initiaValue) 方法对数组中的每个元素按序执行一个由您提供的 callback 函数,每一次运行callback函数会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。
第一次执行回调函数时,不存在“上一次的计算结果”。如果需要回调函数从数组索引为 0 的元素开始执行,则需要传递初始值。否则,数组索引为 0 的元素将被作为初始值 initialValue,迭代器将从第二个元素开始执行(索引为 1 而不是 0)。

var arr = ['taylor', 'swift'];
function noPassValue(){
  return arr.reduce(function(prev,next){
    console.log("prev:",prev);
    console.log("next:",next);
    return prev;
  });
}

function passValue(){
  return arr.reduce(function(prev,next){
    console.log("prev:",prev);
    console.log("next:",next);
    prev[next] = 1;
    return prev;
  },{});
}
console.log("No Additional parameter:",noPassValue());
console.log("----------------");
console.log("With {} as an additional parameter:",passValue());
  • 完整的reduce函数的参数如下
reduce(function(previousValue, currentValue, currentIndex, array) { /* ... */ }, initialValue)

map函数

  • map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
  • map() 方法按照原始数组元素顺序依次处理元素。
  • 注意: map() 不会对空数组进行检测。

  • 注意: map() 不会改变原始数组。

var num = [1, 2, 3, 4, 5]
  
var newNum =  num.map(value => value * 2)
console.log(newNum)

num.map((value, index) => {
  console.log(value, index)
})

reduce实现map

var arr = [1, 2, 3, 4, 5]
  
Array.prototype.map_new = function(callback, cbThis=null) {
    let res = []
    this.reduce((pre, cur, curIndex, arr) => {
        // 传入map回调函数拥有的参数,把每一项的执行结果push进res中
        res.push(callback.call(cbThis, cur, curIndex, arr));
    }, []);
    return res;
};

arr.map_new((cur, curIndex) => {
  console.log(cur, curIndex)
})
//与map对比
arr.map((value, index) => {
  console.log(value, index)
})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值