数组迭代方法及改造

forEach

用来遍历数组的,让数组的每个元素都执行一次回调函数,类似for语句

var arr = [1, 2, '3', '4', 5, 6];

    // forEach 用来遍历数组,让数组中的每一个元素都执行一次回调函数, 类似for语句
    arr.forEach(function (item, index) {
      if (index == 3) {
        // break;// 不能使用break continue, SyntaxError: Illegal break statement
        return;// 只能结束索引为3这个元素执行的函数,索引为4 5元素的的函数依然会执行。所以在forEach不应该提前结束循环,如果需要提前结束循环,要使用for语句:for(){}  for...in   for...of
      }
      console.log(item, index);
    });

forEach的改造:

 var arr = [2, 4, 6, 8];
 function forEach(fn) {
    for (var i = 0; i < arr.length; i++) {
         fn(arr[i], i);
    }
};

map

map是映射的意思,让数组中每一个元素参与运算,把每一个元素的运算结果存入新数组,map执行完毕,得到一个数组

var arr = [1, 2, '3', '4', 5, 6];
var result = arr.map(function(item){
    return item**2;// return 后面返回了什么值,新数组中存入的就是什么值,可以和数组的元素没有关系,但是一般使用map函数都是对原数组中元素的值进行修改,然后把修改后的值存入新数组
});
console.log(result);



// map判断数组中对象
// 年龄不小于18岁,并且是在线状态,添加一个属性:sign: '赶紧出来浪'
// 年龄不小于18岁,并且是非在线状态,添加一个属性:sign: '赶快来摸鱼'
// 其余,添加一个属性:sign: '我是中国好青年'

var friends = [
      { name: '张三', age: 18, online: true },
      { name: '李四', age: 16, online: false },
      { name: '王五', age: 20, online: true },
      { name: '李明', age: 20, online: false },
      { name: '花花', age: 16, online: true },
    ];
    var result = friends.map(function(item){
      if (item.age>=18 && item.online) {
        item.sign = '赶紧出来浪';
      }else if(item.age>=18 && !item.online){
        item.sign = '赶快来摸鱼';
      }else{
        item.sign = '我是中国好青年';
      }
      // console.log(item);
      return item;
    });
    console.log(result);

map改造:

 var arr = [2, 4, 6, 8];
 function map(fn, arr) {
    var tempArr = [];
    for (i in arr) {
       var res = fn(arr[i], i);
          tempArr.push(res);
     }
    return tempArr;
}

every

every 是每一项的意思,如果每一项都符合条件,回调函数全部返回true,最终结果为true;否则为false

var arr = [6, 8, 10, 1, 2, '3', '4', 5, 6];
// every只要遇到有一项不符合条件,函数返回false,结束整个every函数
var result = arr.every(function (item) {
   console.log('every=', item);
   return item % 2 == 0;
});
console.log(result);

every改造:

var arr = [ 2,6 ]

function every(fn) {
    var inn = true
    for (var i = 0; i < arr.length; i++) {
       if(!fn(arr[i])){
          inn = false
           break;
          }
    }
    return inn
 }

some

some 是某些项的意思,只要有一项符合条件,回到函数返回true,最终结果为true;否则返回false

var arr = [1, 2, '3', '4', 5, 6];
// some只要遇到有一项符合条件,函数返回true,结束整个some函数
var result = arr.some(function (item) {
    console.log('some=', item);
    return item % 2 == 0;
});
console.log(result);

some改造:

var arr = [ 2, 3 ]

function every(fn) {
    var inn = false
    for (var i = 0; i < arr.length; i++) {
        if(fn(arr[i])){
           inn = true
         }
     }
     return inn
  }

filter

filter 是筛选的意思,把数组中符合条件的元素筛选出来,存入新数组中,filte执行完毕,得到一个数组

var arr = [1, 2, '3', '4', 5, 6];
var result = arr.filter(function (item) {
      // return item % 2 == 0;// 当return的值为true的时候,才把数组元素item存入新数组
      // if (item>=2 && item<=5) {
      //   return true;
      // }
 return item >= 2 && item <= 5;
});
console.log(result);


// 找出所有在线的对象存入新数组
var friends = [
   { name: 'Tom', age: 22, online: true },
   { name: 'Lily', age: 21, online: false },
   { name: 'Lucy', age: 20, online: true },
   { name: '李明', age: 20, online: false },
   { name: '花花', age: 20, online: true },
 ];
var result = friends.filter(function (item) {
   console.log(item.online);
 // return item.online == true;
    return item.online;
 });
 console.log(result);

filter改造:

var arr = [1, 2, '3', 4, 5, 6]
function filter(fn) {
    var newArr = [];
    for (var i of arr) {
       if (fn(i)){
          newArr.push(i)
        }
     }
     return newArr
 }

reduce

arr.reduce(function(prev, current, index){}, initValue)

参数1:回调函数,回调函数有四个参数:

prev:根据是否提供初始值initValue取值不一样

current:根据是否提供初始值initValue取值不一样

index:数组元素的索引值,根据是否提供初始值initValue取值不一样

参数2:reduce的函数的初始值

  // 情况1:不存在 initvalue
  // 第一次遍历:prev的值是数组中第一个元素的值,current的值是数组中第二个元素的值
  // 从第二次遍历开始:current是数组中下一个元素的值,prev会存储是回调函数上一次return的值
  // reduce函数的返回值是最后一次回调函数return的值
  var arr = [2, 3, 6, 8, 10];
  var result = arr.reduce(function (prev, current, index) {
    // console.log('prev=', prev, 'current=', current, index);
    // return 100;
    // 第一次遍历 2+3 = prev+current = 5   return 5;    然后prev的值变为5
    // 第二次遍历 5+6 = prev+current = 11  return 11;   然后prev的值变为11
    return prev + current;
  });
  console.log(result);

  // var sum = arr.reduce((prev, current) => prev + current);
  // console.log(sum);
// 情况2:存在initValue
// 第一次遍历:prev的是initValue的值,current的值是数组中第一个元素的值
// 从第二次遍历开始:current是数组中下一个元素的值,prev会存储是回调函数上一次return的值
 var arr = [2, 3, 6, 8, 10];
 var result = arr.reduce(function (prev, current, index) {
    console.log('prev=', prev, 'current=', current, index);
    // return 100;
    // 第一次遍历 0+2 = prev+current = 2   return 2;    然后prev的值变为2
    // 第二次遍历 2+3 = prev+current = 5   return 5;    然后prev的值变为5
    return prev + current;
  }, 0);
console.log(result);
 //看个例题
 var arr = [2, 3, 6, 12, 35, 21];
 // 求数组中的偶数和
 var sum = arr.reduce(function (prev, current) {
    if (current % 2 == 0) {
      return prev + current;
    } else {
      return prev;
    }
 }, 0);
 console.log(sum);

reduce改造:

var arr = [1,2,3,4,5];
function reduce(fn,c) {
    if(c==='' || c === 0){
       for(var i of arr){
          c = fn(c,i);
        } 
        return c;
    }else{
      c = arr[0];
      for(i of arr){
        c = fn(c,i);
      }
       return c;
     }
 };

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值