JavaScript中数组方法 forEach、map、every、some返回值、原数组是否变化及中断条件总结

一、forEach

1、返回值的情况:无返回值(undefined);
2、原数组是否改变:如果是通过值类型的方式修改,则不会改变,如果通过下标的方式或者通过引用类型的方式修改,则原数组会发生变化;

3、遍历中断条件:无法中断, 除非 throw Error,但是这样做没有意义,因为会导致整个程序全部终止;

var arr1 = [
   {name:'鸣人',age:16},
   {name:'佐助',age:17}
];
var arr2 = [1,2,3];

arr1.forEach(item => { 
  item.age = item.age + 1}
);

//=> [{name:'鸣人',age:17},{name:'佐助',age:18}]

arr2.forEach(item => {
  item = item * 2}
)

// => [1,2,3]


image.png
      // forEach 方法---不是通过下标的修改方式
      const forEachArray1 = [10, 20, 30, 40];
      const forEachRet = forEachArray1.forEach(item => item + 1)
      console.log('forEach的forEachArray1结果', forEachRet);
      console.log('forEach的forEachArray1原有数组', forEachArray1);

      // forEach 方法---通过修改下标的方式
      const forEachArray2 = [20, 40, 60, 80];
      const forEachRet1 = forEachArray2.forEach((item, index) => forEachArray2[index] = item + 1)
      console.log('forEach的forEachArray2结果', forEachRet1);
      console.log('forEach的forEachArray2原有数组', forEachArray2);


image.png

二、map

1、返回值的情况:如果不return 则无返回值(undefined),否则有返回值;
2、原数组是否改变:如果是通过值类型的方式修改,则不会改变,如果通过下标的方式或者通过引用类型的方式修改,则原数组会发生变化;
3、遍历中断条件:无法中断, 除非 throw Error,但是这样做没有意义,因为会导致整个程序全部终止;

var arr1 = [
   {name:'鸣人',age:16},
   {name:'佐助',age:17}
];
var arr2 = [1,2,3];
var aa=arr1.map((item)=>{item.age=item.age+1})
image.png
      // map 方法---不是通过下标的修改方式
      const mapArray1 = [10, 20, 30, 40];
      const mapRet = mapArray1.map(item => item + 1);
      console.log('map的结果--有返回值', mapRet);
      console.log('map的原有数组--无变化', mapArray1);

      // map方法---通过修改下标的方式
        const mapArray2 = [20, 40, 60, 80];
        const mapRet2 = mapArray2.map((item, index) => {
          mapArray2[index] = item + 1;
          return item
        });
        console.log('map的mapArray2结果', mapRet2);
        console.log('map的mapArray2原有数组', mapArray2);


image.png

三、every

1、返回值的情况:如果是空数组.every,则一律返回true;如果不是空数组,只要回调函数返回的值当中有一个是false,则返回值是false,否则返回值为true;
2、原数组是否改变:如果是通过值类型的方式修改,则不会改变,如果通过下标的方式或者通过引用类型的方式修改,则原数组可能会发生变化;注意返回值的情况,如果返回值为false,则会中断整个循环,导致后续的数组项不会继续执行。
3、遍历中断条件:只要回调函数返回的值为false,则会立即中断;

var arr1 = [
   {name:'鸣人',age:16},
   {name:'佐助',age:17}
];
var arr2 = [1,2,3];
var aa=arr1.every((item)=>{item.age=item.age+1})
image.png
      // every 方法--- 用法1 如果所有都满足条件就返回true 否则返回false
      const everyArray1 = [10, 20, 30, 40];
      const everyRet = everyArray1.every(item => item > 21)
      console.log('every的everyArray1结果', everyRet);
      console.log('every的everyArray1原有数组', everyArray1);

      // every 方法--- 用法2  通过修改下标的方式修改原有数组
      const everyArray2 = [20, 40, 60, 80];
      const everyRet1 = everyArray2.every((item, index) => everyArray2[index] = item + 1)
      console.log('every的everyArray2结果', everyRet1);
      console.log('every的everyArray2原有数组', everyArray2);

      // every 方法--- 用法3  回调函数如果返回false 则循环会立刻终止
      const everyArray3 = [120, 140, 160, 180];
      const everyRet3 = everyArray3.every((item, index) => {
        console.log(`【前】index是${index}`);
        if (index === 2) {
          return false
        }
        console.log(`【后】index是${index}`);
        return true
      })
      console.log('every的everyArray3结果', everyRet3);
      console.log('every的everyArray3原有数组', everyArray3);


image.png
image.png

四、some

1、返回值的情况:如果使用空数组.some,则一律返回false;如果不是空数组,只要回调函数返回的值当中有一个是true,则返回值是true,否则返回值为false;
2、原数组是否改变:如果是通过值类型的方式修改,则不会改变,如果通过下标的方式或者通过引用类型的方式修改,则原数组可能会发生变化;注意返回值的情况,如果返回值为true,则会中断整个循环,导致后续的数组项不会继续执行。
3、遍历中断条件:只要回调函数返回的值为true,则会立即中断;

var arr1 = [
   {name:'鸣人',age:16},
   {name:'佐助',age:17}
];
var arr2 = [1,2,3];
var aa=arr1.some((item)=>{item.age=item.age+1})
image.png
      // some 方法--- 用法1 只要回调函数返回了true 则返回true 否则返回false
      const someArray1 = [10, 20, 30, 40];
      const someRet = someArray1.some(item => item > 21)
      console.log('some的someArray1结果', someRet);
      console.log('some的someArray1原有数组', someArray1);

      // some 方法--- 用法2  通过修改下标的方式修改原有数组
      const someArray2 = [20, 40, 60, 80];
      const someRet1 = someArray2.some((item, index) => someArray2[index] = item + 1)
      console.log('some的someArray2结果', someRet1);
      console.log('some的someArray2原有数组', someArray2);

      // some 方法--- 用法3  回调函数如果返回false 则循环会立刻终止
      const someArray3 = [120, 140, 160, 180];
      const someRet3 = someArray3.some((item, index) => {
        console.log(`【前】index是${index}`);
        if (index === 2) {
          return false
        }
        console.log(`【后】index是${index}`);
        return true
      })
      console.log('some的someArray3结果', someRet3);
      console.log('some的someArray3原有数组', someArray3);


image.png

另:这里简单提一下reduce、filter、find方法:
1、reduce 返回的是累计器累计完后的单个值,原数组不会发生变化;

      // reduce 方法
      const reduceArray1 = [10, 20, 30, 40];
      const firstVal = 100;
      const reduceFunc = (lastReturn, item) => lastReturn + item
      const reduceRet = reduceArray1.reduce(reduceFunc, firstVal)
      console.log('reduce的结果---有返回值', reduceRet);
      console.log('reduce的原有数组--无变化', reduceArray1);
image.png

2、filter 返回的是一个新数组,数组里的内容是回调函数运行后为true的各项值;

      // filter 方法
      const filterArray1 = [10, 20, 30, 40];
      const filterFunc = item => item > 22
      const filterRet = filterArray1.filter(filterFunc)
      console.log('filter的结果---有返回值', filterRet);
      console.log('filter的原有数组--无变化', filterArray1);
image.png

3、find 顾名思义,查找
其只返回 第一个符合条件

var potatos = [{ id: '1001', weight: 50 },
{ id: '1002', weight: 80 },
{ id: '1003', weight: 120 },
{ id: '1004', weight: 40 },
{ id: '1005', weight: 110 },
{ id: '1006', weight: 60 }]

var result; 
result=potatos.find((item)=>{ console.log(item); return item.id==='1004'})

console.log('result',result,'potatos',potatos)

image.png

推荐阅读:
生动形象解释forEach、filter、map、some、every、find、findIndex、reduce间的区别

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,738评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,377评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,774评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,032评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,015评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,239评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,724评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,374评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,410评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,457评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,132评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,733评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,804评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,022评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,515评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,116评论 2 341

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,103评论 0 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • #每日金句 效能等于效率乘以方向 -【早起打卡】20180719 05:32 -践行人员 余莎 -【践行天数】43...
    Cherishyu阅读 80评论 0 0
  • 2017 12 22/冬至特写 今日过节 大家节日愉快哈 群发的短信我一条也没有回复,我觉得人家群发,我回复吧,人...
    职场有料妹阅读 438评论 13 25
  • 昨晚趁爸爸和奶奶上楼了,偷溜出去吃了碗喜欢的炒面,很幸福很满足。 早上起床做早课,想到一提好吃的,就眼巴眼望的。记...
    韩悦沐_疗愈_成长阅读 394评论 0 0