数组常用方法学习

最近面试经常被问到一些数组操作问题,正好在工作中学习了这些方法之后,大大方便了我日常对数组的操作, 所以这次系统的总结一次,即方便我日常查看,也为工作面试做一些积累。

1、 .some()

定义
some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。
some() 方法会依次执行数组的每个元素:

  • 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
  • 如果没有满足条件的元素,则返回false。

接受三个参数:

  • item:数组中正在处理的元素。
  • index:数组中正在处理的元素的索引值。
  • array:some()被调用的数组。

注意:

  • some() 不会对空数组进行检测。
  • some() 不会改变原始数组。

array.some(function(item,index,array),thisValue)

描述:

some 为数组中的每一个元素执行一次 callback 函数,直到找到一个使得 callback 返回一个“真值”(即可转换为布尔值 true 的值)。如果找到了这样一个值,some 将会立即返回 true。

some为数组中的每一个元素执行一次fn函数,直到找到一个使得fn返回 true 。如果找到了这样一个值,some将立即返回 ture ,其余的就不在运行,相当于短路运算符( && || )一样。如果到结束也没有找到,就会返回 false 。

fn 被调用是传入三个参数:元素的值,元素的索引,被遍历的数组。

some被调用不会改变数组。

    let arr = [11,50,40,3,5,80,90,4];
    let isHave = arr.some(item=>{
        return item<49
    })
    isHave?console.log('存在小于49的值'):console.log('不存在小于49的值')
    //0
    //1
    //2
    //3
    //'存在小于10的值'

当遇到返回结果为true时,some()停止执行

2、 .every()

定义
every() 方法用于检测数组所有元素是否都符合指定条件。
every() 方法使用指定函数检测数组中的所有元素:

  • 如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
  • 如果所有元素都满足条件,则返回 true。

接受三个参数:

  • item:数组中正在处理的元素。
  • index:数组中正在处理的元素的索引值。
  • array:some()被调用的数组。

array.every(function(currentValue,index,arr), thisValue)

注意:

  • every() 不会对空数组进行检测。
  • every() 不会改变原始数组。

every()和some()的区别:

every()是对数组中每一项运行给定函数,如果该函数对每一项返回true,则返回true。
some()是对数组中每一项运行给定函数,如果该函数对任一项返回true,则返回true。

    let arr1 = [1,2,3,4];  
    let res1_1 = arr1.some(item=>{
        return item>3
    })
    console.log(res1_1)//true,存在大于3的元素
    let res1_2 = arr1.every(item=>{
        return item>3
    })
    console.log(res1_2)//false
    let arr2 = [12,22,32,42];
    let res2 = arr2.every(item=>{
        return item>3
    })
    console.log(res2)//true,所有元素大于3

3、 .filter()

定义
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。

接受三个参数:

  • item:数组中正在处理的元素。
  • index:数组中正在处理的元素的索引值。
  • array:some()被调用的数组。

array.filter(function(item,index,array), thisValue)

注意:

  • filter() 不会对空数组进行检测。
  • filter() 不会改变原始数组。

描述:

filter把传入的函数依次作用于每个元素,然后根据返回值是 true 还是false决定保留还是丢弃该元素。

简单的数组去重:

    let arr = [1, 2, 4, 2, 6, 4, 2, 15];
    let newArr = arr.filter((item,index)=>{
        return arr.indexOf(item)==index
    });
    console.log(newArr)//[1,2,4,6,15]

去除重复元素依靠的是 indexOf 总是返回第一个元素的位置,后续的重复元素位置与 indexOf 返回的位置不相等,因此被 filter 滤掉了。

清除空字符串:

    let arr = ['  A', '', 'B', null, undefined, '    C', '     '];
    let newArr = arr.filter(item=>{
         return item && item.trim(); // 注:IE9(不包含IE9)以下的版本没有trim()方法
    });
    console.log(newArr)// ['  A', 'B', '    C']

如果想要去除' C'前面的空格,就不能使用filter方法了,因为他并不能改变原始item的值,只能决定去留,这时候需要使用.map()方法

4、 .map()

定义
map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。

接受三个参数:

  • item:数组中正在处理的元素。
  • index:数组中正在处理的元素的索引值。
  • array:some()被调用的数组。

array.map(function(item,index,array), thisValue)

注意:

  • map() 不会对空数组进行检测。
  • map() 不会改变原始数组。

描述:

实际上对数组的每个元素都遍历一次,同时处理每个元素,最后返回一个新的值。

所以刚刚.filter()想清除所有空并包括字符串前后的空,需要这样:

    let arr = ['  A', '', 'B', null, undefined, '    C', '     '];
    let newArr = arr.filter(item=>{
         return item && item.trim(); // 注:IE9(不包含IE9)以下的版本没有trim()方法
    });
    console.log(newArr)// ['  A', 'B', '    C']
    newArr = newArr.map(item=>{
         return item && item.trim(); // 注:IE9(不包含IE9)以下的版本没有trim()方法
    });
    console.log(newArr)// ['A', 'B', 'C']

先筛选一遍,留下非空的元素,在通过.map()清除非空元素前后的空格,同时,这2个函数也可以链式调用:

    let arr = ['  A', '', 'B', null, undefined, '    C', '     '];
    let newArr = arr.filter(item=>{
         return item && item.trim(); // 注:IE9(不包含IE9)以下的版本没有trim()方法
    }).map(item=>{
         return item && item.trim(); // 注:IE9(不包含IE9)以下的版本没有trim()方法
    });
    console.log(newArr)// ['A', 'B', 'C']

.map()方法是有返回值的,可以return出来,并且不会改变原数组

    let ary = [1,2,3,4,5];
    let res = ary.map(function (item,index,array) {
        return item*10;
    })
    console.log(res);//-->[10,20,30,40,50];  原数组拷贝了一份,并进行了修改
    console.log(ary);//-->[1,2,3,4,5];  原数组并未发生变化

map方法内也可以用箭头函数简化写成:

    let ary = [1,2,3,4,5];
    let res = ary.map((item,index,array)=>{
        return item*10;
    })

5、 .forEach()

定义
forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。

接受五个参数:

  • item:数组中正在处理的元素。
  • index:可选,数组中正在处理的元素的索引值。
  • array:可选。当前元素所属的数组对象。

array.forEach(function(item,index,array), thisValue)

注意:

  • forEach() 对于空数组是不会执行回调函数的。
  • forEach() 没有返回值。

改变数组中的项,没有返回值res:

    let ary = [1,2,3,4];
    let res = ary.forEach(function (item,index,array) {
           array[index] = item*10;
    })
    console.log(res);//--> undefined;
    console.log(ary);//--> [10,20,30,40]

给数组中对象添加元素,没有返回值res:

    let ary = [{name:'aa',age:'18'},{name:'bb',age:'182'}];
    let res = ary.forEach(function (item,index,array) {
       // array[index]['num'] = item.age*10;2种写法都行
       item['num'] = item.age*10;
    })
    console.log(res);
    // undefined;
    console.log(ary);
    // [{name:'aa',age:'18',num:'180'},{name:'bb',age:'182',num:'1820'}]

6、 .reduce()

定义
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

接受五个参数:

  • item:数组中正在处理的元素。
  • index:数组中正在处理的元素的索引值。
  • array:some()被调用的数组。
  • total:上一次调用回调返回的值(计算结束后的返回值),或者是提供的初始值(initialValue)。
  • initialValue:可选。传递给函数的初始值(特殊情况会用到)。其值用于第一次调用 callback 的第一个参数。如果没有设置初始值,则将数组中的第一个元素作为初始值。

array.reduce(function(total, item,index, array), initialValue)

注意:

  • reduce() 对于空数组是不会执行回调函数的。

下面就是reduce()的一个基本的累加:

    let nums = [0, 1, 2, 3, 4]
    let totalNum = nums.reduce((item,total) => {
      return total+item; 
    })
    console.log(totalNum)//10

去重数组中相同属性的数据,并添加该数据到新数组:

    let offerArr = [
        {name:'Amy',age: 20},
        {name:'Tom',age:21},
        {name:'Rose',age:22},
        {name:'Tom',age:23}];
    let obj = {};
    let newArr2 = offerArr.reduce((total, item,index) => {
        obj[item.name] ? '' : obj[item.name] =true && total.push(item)
        return total
    }, []) 
    console.log(newArr2)
    // [
    //  {name:'Amy',age: 20},
    //  {name:'Tom',age:21},
    //  {name:'Rose',age:22}
    // ];

7、 .splice()

定义
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。

接受三个参数:

  • index:必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
  • howmany:必需。要删除的项目数量。如果设置为 0,则不会删除项目。
  • item1, ..., itemX:可选。向数组添加的新项目。

array.splice(index,howmany,item1,.....,itemX)

注意:

  • 该方法会改变原始数组。

      let offerArr = [
      {name:'Amy',age: 20},
      {name:'Tom',age:21},
      {name:'Rose',age:22},
      {name:'Tom',age:23}];
      offerArr.splice(2,1)//从下标为2开始删除1项
      
      console.log(offerArr)
      //[{name:'Amy',age: 20},{name:'Tom',age:21},{name:'Tom',age:23}];
      
      offerArr.splice(2,0,{name:'Tom',age:21})
      //从下标为2开始删除0项,添加1项
      
      console.log(offerArr)
      //[{name:'Amy',age: 20},{name:'Tom',age:21},
      {name:'Tom',age:21},{name:'Tom',age:23}];
      
      offerArr.splice(1,3,{name:'Amy',age:21},{name:'Amy',age:21})
      //从下标为1开始删除3项添加2项
      
      console.log(offerArr)
      //[{name:'Amy',age: 20},{name:'Amy',age:21},{name:'Amy',age:21}];
    

8、 .reverse()

定义
.reverse()用于颠倒数组中元素的顺序。

array.reverse()

注意:

  • 该方法会改变原来的数组,而不会创建新的数组。

      let nums = [1, 2, 3, 4];
      nums.reverse();
      console.log(nums)//4,3,2,1
    

9、 .join()

定义
.join() 方法用于把数组中的所有元素放入一个字符串。

接受一个个参数:

  • separator:可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符。

array.join(separator)

    let arr = [1,2,3,4]
    let bbc = arr.join()
    console.log(bbc)//1,2,3,4

10、 .concat()

定义
concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。

接受一个参数:

  • arrayX:可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符。

array.concat(arrayX,arrayX,......,arrayX)

    let arr1 = [1,2,3,4];
    let arr2 = [5,6,7,8];
    let arr3 = arr2.concat(arr1)
    console.log(arr3)//[5,6,7,8,1,2,3,4]

11、 .indexOf()

定义
indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
若存在参数,返回这个参数在数组里面的索引值,如果参数不在操作的数组中,则返回 -1。

    let arr = [1,2,3,4];
    arr.indexOf(1) // 0
    arr.indexOf(5) // -1

12、 Array.of()

定义
Array.of()方法:数组创建,将参数中所有值作为元素形成数组,如果参数为空,则返回一个空数组。

    console.log(Array.of(1, 2, 3, 4)); // [1, 2, 3, 4]
    // 参数值可为不同类型
    console.log(Array.of(1, '2', true,{'name':'hk'}));
    // [1, '2', true,{'name':'hk'}]
    // 参数为空时返回空数组
    console.log(Array.of()); // []

13、 find()

定义
find()方法:查找数组中符合条件的元素,若有多个符合条件的元素,则返回第一个元素。

    let arr = Array.of(1, 2, 3, 4);
    console.log(arr.find(item => item > 2)); // 3

14、 includes()

定义
includes() 方法:检测数组中是否包含一个值,如果是返回 true,否则false。

接受两个参数:

  • searchElement:必须。需要查找的元素值。
  • fromIndex:可选。从该索引处开始查找 searchElement。默认为 0。

arr.includes(searchElement)
arr.includes(searchElement, fromIndex)

    // 参数1:包含的指定值
    [1, 2, 3].includes(1);    // true
    // 参数2:可选,搜索的起始索引,默认为0
    [1, 2, 3].includes(1, 2); // false
    // NaN 的包含判断
    [1, NaN, 3].includes(NaN); // true

15、 fill()

定义
fill() 方法用于将一个固定值替换数组的元素。

接受两个参数:

  • value:必需。填充的值。
  • start:可选。开始填充位置。
  • end:可选。停止填充位置 (默认为 array.length)

array.fill(value, start, end)

    let arr = Array.of(1, 2, 3, 4);
    // 参数1:用来填充的值
    // 参数2:被填充的起始索引
    // 参数3(可选):被填充的结束索引,默认为数组末尾
    console.log(arr.fill(0,1,2)); // [1, 0, 3, 4]

16、 flat()

定义
数组扁平化,嵌套数组转一维数组

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