前言

前端的童鞋们都知道,关于js的数据操作方法有许多,最近有时间于是整理了一下,与诸位分享。有不对的地方还请大家不吝赐教(allan_liu986@163.com)。下面开始正文:
复制代码

按照功能划分:

  • 普通方法:直接操作数组元素(增、删、替换、转字符串)
  • 遍历方法:对数组的遍历(for循环等)

普通方法:

1. Array.push(item, item1, item2...)

参数:item可以是多个参数,也可以是数组变量
新数组:只返回新数组的长度
旧数组:返回push后的包含所有的元素的数组
注意:1.将push的参数放在数组的最后一位2.如果push一个数组变量时,新数组的数组长度只会+1;旧数组会根据增加的数据变为多维数组。
复制代码
 eg://原数组:const arr = [1, 2];const item = [3, '4']//新数组:只返回新数组的长度const newPush = arr.push(item);console.log(arr)      //[1, 2, [3, '4']] console.log(newPush)  //3
复制代码

2. Array.pop()

参数:该方法不接收任何参数
新数组:返回删除的元素
原数组:删除原数组的最后一个元素
注意:该方法删除的是原数组的最后一个元素
复制代码
 eg://原数组const arr = [1, 2, 3];//新数组const newPop = arr.pop();console.log(arr);   //[1,2]console.log(newPop);//3
复制代码

3. Array.unshift()

注意:unshift()方法和push()的用法基本一致,不过是将添加的参数放在了数组的第一位。
复制代码
 eg://原数组:const arr = [1, 2];const item = [3, '4']//新数组:只返回新数组的长度const newUnshift = arr.unshift(item);console.log(arr)      //[ [3, '4'], 1, 2]console.log(newUnshift)  //3
复制代码

4. Array.shift()

shift()方法的介绍请参考pop()方法,但是删除的数组第一个元素。
复制代码
 eg://原数组const arr = [1, 2, 3];//新数组const newPop = arr.shift();console.log(arr);   //[2, 3]console.log(newPop);//1
复制代码

5. Array.splice()

  用法:splice(删除原/添加新 元素的起始下标,删除的长度, 要添加的元素1,元素2, 元素3)新数组:返回删除元素旧数组:删除元素以后的新数组 (splice添加的元素,会插入删除的元素的位置)注意:1. 当splice的第一个参数为负数时,-1为最后一个元素,-2为倒数第二个参数,-3 以此类推。。2. 当splice的第二个参数为0时,该方法只向旧数组添加元素
复制代码
 eg://原数组const arr = [4, 5, 6, 7, 1, 7];//新数组const arrSplice = arr.splice(-2, 2, 9, 8)console.log(arrSplice)  //[1,7]console.log(arr)        //[4, 5, 6, 7, 9, 8]
复制代码

6. Array.sort()

sort()作用:默认升序显示(按值升序、字母升序排序)注意:1. 是直接作用在原数组上的方法,不会有返回值。2. 如果是两位数字,只会比较第一位3. 自定义用法: a -b (升序)b -a (降序)补充:a, b为默认参数,代表每次参与对比的两个元素。
复制代码
 eg1:const arrSort = [4, 5, 6, 7, 1, 7].sort()console.log(arrSort)  //[1, 4, 5, 6, 7, 7]eg2:const newSort = [4, 1, 12, 25, 113, 7].sort( (a, b) => { return b - a;})console.log(newSort)//[113, 25, 12, 7, 4, 1]
复制代码

7. Array.reverse()

reverse()作用:返回反转元素后的数组。注意:是直接作用在原数组上的方法,不会有返回值。
复制代码
 eg:const arr = [4, 5, 6, 7, 1, 7];const arrReverse = arr.reverse()console.log(arrReverse)//[7, 1, 7, 6, 5, 4]
复制代码

8. Array.slice()

ES5:
1.slice(要拷贝的开始下标,结束下标) 不包括结束; 浅拷贝数组元素
新数组:返回拷贝的数组
旧数组:视拷贝的情况决定会不会改变原数组
注意:如果只写一个参数( 默认为起始下标 ),后面的所有元素都会拷贝简单数据类型:如果数组的元素是number类型,或者str类型,新数组会浅拷贝原来的数组。改变之后互不影响。复杂数据类型:如果元素被改变,原数组和新数组都会变(拷贝的只是指向原数组的指针,所以无论改变原数组,还是浅拷贝的数组,都是改变原数组的数据)
复制代码
 eg1:const arr = [4, 5, 6, 7, 1, 7];const arrSlice = arr.slice(2)console.log(arrSlice)   //[6, 7, 1, 7]eg2:let a= ['hello','world'];let b=a.slice(0,1);     // ['hello']a[0]='改变原数组';console.log(a,b);       // a = ['改变原数组','world'] b = ['hello']b[0]='改变拷贝的数组';console.log(a,b);       // ['改变原数组','world'] ['改变拷贝的数组']eg3:let c = [{name: 'liu'}] let d = c.slice()c[0].name = '改变name'console.log(c, d)      //[{name: "改变name"}], [{{name: "改变name"}}]
复制代码

9. Array.join()

ES5:
2.join(参数a) 在数组的每一个元素后面添加参数a;默认是用,做为分隔符
新数组: 返回一个字符串
旧数组:没有改变
注意:join()/toString()方法在数组元素是数组的时候,会将里面的数组也调用join()/toString();多维数组扁平化最快处理办法如果是对象的话,对象会被转为[object Object]字符串。
补充:js的序列化和反序列化序列化:对象转字符串反序列化: 字符串转对象
复制代码
 //eg1:const arr = [4, 5, 6, 7, 1, 7];const arrJoin = arr.join()console.log(arr, arrJoin)      //[4, 5, 6, 7, 1, 7]  "4,5,6,7,1,7"
// eg2: 多维数组扁平化(挺好用) let a= [['liu','23', [1,2,['21','13']]],'test'];let str1=a.join();  console.log(str1)              //liu,23,1,2,21,13,test
// eg3: 为对象数组时let b= [{name:'liu',age:'23'}];let str2 = b.join(); console.log(JSON.stringify(str2));// [object Object],test// 对象转字符串推荐JSON.stringify(obj);只是改变了序列化而已,并不能还原数组复制代码

10. Array.toLocaleString()

ES5:
3. toLocaleString() 数组转字符串,没有参数新数组: 转成字符串旧数组: 不变作用:数组转字符串注意:1.toLocaleString()还是调用的join()方法2.调用数组的toLocaleString方法,数组中的每个元素都会调用自身的toLocaleString方法,3.对象调用对象的toLocaleString,Date调用Date的toLocaleString
复制代码
 //eg1:const arr = [4, 5, 6, 7, 1, 7];const arrToLocaleString = arr.toLocaleString()const arrJoin = arr.join()//和join的作用一样,都是数组转字符串console.log(arr,arrJoin, arrToLocaleString) //[4, 5, 6, 7, 1, 7] "4,5,6,7,1,7" "4,5,6,7,1,7"
//eg2:let a=[{name:'OBKoro1'},23,'abcd',new Date()];let str=a.toLocaleString(); console.log(str, '--str--')//[object Object],23,abcd,2019/4/11 下午10:01:08
复制代码

11. Array.toString()

ES5:4. toString()数组转字符串注意:1.和join()方法效果一样,但是没有优势。因为不能自定义分割2.当数组和字符串操作的时候,js会调用这个方法将数组自动转换成字符串3.数组的元素之间依然有逗号分割,最后一个元素会与数组外面所有的字符串连为一体。
复制代码
 //eg1:const arr = [4, 5, 6, 7, 1, 7];const arrToString = arr.toString()console.log(arr, arrToString)//[4, 5, 6, 7, 1, 7] "4,5,6,7,1,7"
//eg2:let a= [ 'toString','演示'].toString(); let b= ['调用toString','123', '连接在我后面']+'啦啦啦' + '12'; console.log(a)              // toString,演示console.log(b)              // 调用toString,连接在我后面啦啦啦
复制代码

12. Array.concat()

ES6:1. concat(): 将多个数组拼接成一个数组,可以接收多个数组参数(参数也可以是具体的值)新数组:按照老数组+参数数组1+参数数组2...的方式进行合并老数组:没有发生变化
复制代码
 //eg1:const arr = [4, 5, 6, 7, 1, 7];const arr1 = 'e'const arr2 = [{name: 'liu'},1]const arrConcet = arr.concat(arr2, arr1)console.log(arrConcet)    //[4, 5, 6, 7, 1, 7, {name: 'liu'}, 1, "e"]
复制代码

13. ...展开运算符

ES6:1. ...Array: 作用:常规用法可以展开 数组/对象 元素补充:更多关于展开运算符请看这里[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_syntax]()
复制代码
 //字面量数组构造或字符串:const arr = [4, 5, 6, 7, 1, 7];const arr1 =  [...arr, 'a']console.log(arr1, '---展开运算符---')//eg2: 这里提一点:ECMAScript 2018规范新增特性const obj = {name: 'liu', sex: '男'}const obj1 = {...obj, age: 20}console.log(obj1, '---obj1---')//eg3:function myFunction(x, y, z) { console.log(x, y, z, '---xyz---')}var args = [0, 1, 2];myFunction(args)//[0, 1, 2] undefined undefined //apply语法:func.apply(thisArg, [argsArray]);这里thisArg为null, [0,1,2]传值给[argsArray]myFunction.apply(null, args); //0,1,2myFunction(...args);//0,1,2 可以看出,使用了展开运算符更加简洁
复制代码

14. indexOf()

ES6:1. Array.indexOf(): 用法:indexOf() 查找数组是否存在某个元素,返回下标;不存在则返回0注意:数组的indexOf是严格匹配“ === ” ; 不识别NaN字符串类型的indexOf是可以找到的
复制代码
 eg1:const arr = [4, 5, 6, 7, 1, 7];const arr1 = ['aa', 1, 3, NaN, undefined]console.log(arr1.indexOf('a'))      //-1console.log(arr1.indexOf(NaN))      //-1console.log(arr1.indexOf(undefined))//4eg2:const str = 'qwe'console.log(str.indexOf('d'))       //-1
复制代码

15. lastIndexOf()

ES6:1. Array.lastIndexOf(): 逆向查找用法:接收两个参数:第一个:要查找的元素;第二个:要从下标几向前查找(-1为数组最末位,-2,-3类推。。)
复制代码
 eg1:const arr = [4, 5, 6, 7, 1, 7];console.log(arr.lastIndexOf(7, -1));  //5let a=['a',4,'b',1,2,'b',3,4,5,'b'];  // 数组长度为10let b=a.lastIndexOf('b',4);          // 从下标4开始往前找 返回下标2let b1=a.lastIndexOf('b',100);      //  大于或数组的长度 查找整个数组 返回9let b2=a.lastIndexOf('b',-11);      // -1 数组不会被查找let b3=a.lastIndexOf('b',-9);       // 从第二个元素4往前查找,没有找到 返回-1console.log(b, b1, b2, b3);//2,9,-1,-1
复制代码

16. includes()

ES6:1. Array.includes(): 判断数组是否包含某个值用法:接收两个参数:第一个参数是要查找的元素(可以是变量),第二个参数是查找的起始下标注意:第二个参数:接受负值。正值超过数组长度,数组不会被搜索,返回false。负值绝对值超过长数组度,重置从0开始搜索。因为indexOf方法不能识别NaN;indexOf方法检查是否包含某个值不够语义化,需要判断是否不等于-1,表达不够直观
复制代码
 eg1:const arr = [4, 5, 6, 7, 1, 7];const flag = 4const arrIncludes = arr.includes(flag, -6) //true
复制代码

---------------数组的操作方法到此结束了,下面开始数组的遍历方法---------

1. forEach()

ES5:1. Array.forEach(): 用法:接收三个参数:第一个参数是遍历的当前元素,第二个参数是当前元素的索引,第三个参数:原数组注意:1.无法中途退出循环,只能用return退出本次回调,进行下一次回调。2.空元素会直接跳过本次回调。3. 遍历次数再第一次循环前就会确定,循环过程中添加到数组中的元素不会被遍历。
复制代码
 eg1:let a = [1, 2, ,3]; // 最后第二个元素是空的,不会遍历(undefined、null会遍历)let obj = { name: 'liu' };let result = a.forEach(function (value, index, array) { a[3] = '改变元素';a.push('添加到尾端,不会被遍历')console.log(value, 'forEach传递的第一个参数'); // 分别打印 1 ,2 ,改变元素console.log(this.name); // liu 打印三次 this绑定在obj对象上// break; // break会报错return value; // return只能结束本次回调 会执行下次回调console.log('不会执行,因为return 会执行下一次循环回调')}, obj);console.log(result); // 即使return了一个值,也还是返回undefined
复制代码

2. filter()

ES5:1. var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])用法: 创建一个新数组,其包含通过所提供函数实现的测试的所有元素。 thisArg: 执行 callback 时,用于 this 的值。
复制代码
 //eg1:
var numbers = [5, 6, 2, 3, 7];
var max = Math.max.apply(null, numbers);
console.log(max);//7
var min = Math.min.apply(null, numbers);
console.log(min);//2//eg2:
var array = ['a', 'b'];
var elements = [0, 1, 2];
array.push.apply(array, elements);
console.info(array); // ["a", "b", 0, 1, 2]
复制代码

3. every()

  返回布尔值; 检查数组的每个元素是否满足条件,如果有一项不满足条件则整个表达式返回false
复制代码
 //eg1:let arr = [4, 5, 6, 7, 1, 7];let value = arr.every( (item, index, arr) => {return  item > 1})console.log(value) //false
复制代码

4. some()

  返回布尔值; 数组中是否有一项满足条件的元素,整个表达式返回true。都不满足才会返回false
复制代码
 //eg1:let arr = [4, 5, 6, 7, 1, 7];let value1 = arr.some((item) => {return item >= 7})console.log(value1) //true
复制代码

5. filter()

  返回满足条件的新数组
复制代码
 //eg1:let arr = [4, 5, 6, 7, 1, 7];let value2 = arr.filter((item) => {return item >= 6})console.log(value2) //[6,7,7]
复制代码

6. map()

  返回一个做完逻辑运算的新数组
复制代码
 //eg1:let arr = [4, 5, 6, 7, 1, 7];let value3 = arr.map((item) => {return item + '5'})console.log(value3)  //["45", "55", "65", "75", "15", "75"]
复制代码

7. reduce()

   reduce(): 可以做一个多维数组转一维数组,比较简便,有效补充:1.a,b 是数组的第一个、二个元素;之后是两个元素运算的结果,继续去和第3个元素作运算2.eg中的 -1 设置了箭头函数以外的参数,会把该参数值作为数组的第一个元素去做运算
复制代码
 //eg1:let arr2 = [1,2, 3, 4]let arrReduce = arr2.reduce((a, b) => {return a * b}, -1)console.log(arrReduce)          //-24
//eg2:let arr3 = [[3,4], [-1, 1], ['qwe', {name: 'liu'}]]let arrConcat = arr3.reduce((a, b) => {return a.concat(b)})console.log(arrConcat)          //[3, 4, -1, 1, "qwe", {name: 'liu'}]
复制代码

8. reduceRight()

reduceRight() 从右往左累加;除了和reduce的方向相反,其他用法一样
复制代码
let arr4 = [[3,4], [-1, 1], ['qwe', {name: 'liu'}]]let arrReduceRight = arr4.reduceRight((a, b) => {return a.concat(b)})console.log(arrReduceRight) //["qwe", {name: 'liu'}, -1, 1, 3, 4]
复制代码

9. find()

find() 返回数组中第一个满足条件的元素,没有则返回undefined
复制代码
//eg1:let arr = [4, 5, 6, 7, 1, 7]let arrFind = arr.find((item) => {return item > 16})console.log(arrFind) //undefined
复制代码

10. findIndex()

findIndex() 返回数组元素第一个满足条件的元素下标,没有则返回-1
这两个方法都识别NaN
复制代码
//eg1:let arr = [4, 5, 6, 7, 1, 7]let arrFindIndex = arr.findIndex((item) => {return item > 16})console.log(arr, arrFindIndex)  //-1
复制代码

12. ES6 keys()&values()&entries() 遍历键名、遍历键值、遍历键名+键值

findIndex() 返回数组元素第一个满足条件的元素下标,没有则返回-1
这两个方法都识别NaN
复制代码
//eg1:for(let item of ['a', 'b'].keys()) {console.log(item, '--index---')        //1,2}
//eg2:for(let item of ['a', 'b'].values()) {console.log(item, '--values---')      //a,b}
//eg3:for(let [item, index] of ['a', 'b'].entries()) {console.log(item, index, '--index---') //0 'a', 1 'b'}
复制代码

13. flat()

flat():返回一个新数组默认拉伸一维数组;新数组:拉伸后的新数组旧数组:没有发生改变注意:如果有空位,会直接跳过参数有两种形式:1.直接用Infinity关键字即可(建议) 2. 多维数组时拉伸的维数-1是接收参数值。
复制代码
//eg1:let arrFlat = [1,[2,3, [4, , ['q','w']]],6].flat(Infinity)console.log(arrFlat, '---flat---')//[1, 2, 3, 4, "q", "w", 6]
复制代码

14. flatMap()

flatMap():接收3个参数:当前元素,当前元素索引,原数组作用:只能将二维数组拉伸为一维数组,三维数组拉伸为二维数组。。。。(还是一个用来遍历的方法,但是参照返回值,并不好用。。。)旧数组: 没有影响新数组: 返回拉伸一个维度后的新数组, 不满足条件的元素会显示undefined
复制代码
//eg1:let array = [1,[2,3, [7, 8]],[4,5],6]let arrFlatMap = array.flatMap((item, index) => {if(item > 5) return index})console.log(array, arrFlatMap, '---flatMap---') // [undefined, undefined, undefined, 6]复制代码

结语:

到这里就结束了,大概写了两天多,自己总结一番,巩固记忆,也方便大家查阅。文章如有不正确的地方欢迎各位大佬鞭策!希望大家看完可以有所收获,喜欢的话,赶紧点波关注/喜欢。
复制代码

希望看完的朋友可以点个喜欢/关注,您的支持是对我最大的鼓励。
微信:

邮箱:allan_liu986@163.com

【干货】js 数组操作合集(前端自我修养)相关推荐

  1. Node.js脚本项目合集(一):Node.js+FFmpeg实现批量从B站导出离线缓存视频到mp4格式,mp4转mp3,实现听歌自由

    Node.js脚本项目合集(一):Node.js+FFmpeg实现批量从B站导出离线缓存视频到mp4格式,mp4转mp3,实现听歌自由 前言 一.准备工作以及介绍 1.什么是FFmpeg 2.FFmp ...

  2. js map 排序_数组方法写给女友的一系列 JS 数组操作(建议收藏 | 内附思维导图)...

    前言 最近和女友,咳咳...(说出来可能会被打s)学习JS数组方法,用几个字形容的话就是听说过,实际使用.遇到的时候就分不清具体方法会得到怎样的结果. 今天我将通过这篇文章好好整理一下关于JS数组的方 ...

  3. 「数组方法」写给女友的一系列 JS 数组操作(建议收藏 | 内附思维导图)

    前言 最近和女友,咳咳-(说出来可能会被打s)学习JS数组方法,用几个字形容的话就是听说过,实际使用.遇到的时候就分不清具体方法会得到怎样的结果. 今天我将通过这篇文章好好整理一下关于JS数组的方法, ...

  4. js数组操作(push,pop,shift,unshift,slice,splice,concat,sort)

    js中针对数组操作的方法还是比较多的,今天突然想到来总结一下,也算是温故而知新吧.不过不会针对每个方法进行讲解,我只是选择其中的一些来讲. 首先来讲一下push和pop方法,这两个方法只会对数组从尾部 ...

  5. 【重磅干货】信息化方案合集下载!

    公众号回复:干货,领取价值58元/套IT管理体系文档 公众号回复:ITIL教材,领取最新ITIL4中文教材 更多专业文档请访问 www.itilzj.com 上一期给大家分享了数字化全集共200份的资 ...

  6. 珍宝鸭的力扣练习(14):栈操作合集

    通用方法:辅助栈 考虑借用一个辅助栈 stack ,模拟 压入 / 弹出操作的排列.根据是否模拟成功,即可得到结果. 题目合集: 题目1:栈的压入.弹出序列 题目2: 双栈实现队列 ) 题目1:栈的压 ...

  7. js数组操作各种方法

    JS数组方法汇总 shift:删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a:[2, ...

  8. JS数组操作之增删改查

    JS提供了很多方便操作数组的方法,本文所要分享的就是如何快速对数组进行增.删.改.查. 一.增 1.push() 可接收任意数量的参数,把它们逐个添加至数组末尾,并返回修改后数组的长度.例如: var ...

  9. js 数组移除_2020前端面试--常见的js面试题

    (答案持续更新...) 1.简述同步和异步的区别 js是一门单线程语言,所谓"单线程",就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务 ...

  10. es6 数组合并_13个不low的JS数组操作,你需要知道一下

    作者 | 火狼1来源 | https://juejin.im/post/5c92e385e51d450ce11df1d1 前言 本文主要从应用来讲数组api的一些骚操作:如一行代码扁平化n维数组.数组 ...

最新文章

  1. OSChina 周日乱弹 —— 比996更先进的是365工作制
  2. 特征计算 -获取本周,本月初,本月末,上月同日,本季,本年初,本年末的日期 - (Python、MySQL、Oracle)
  3. 哈达玛变换的应用SATD、SAD等匹配算法
  4. 大三,一点回忆,一点难忘
  5. 千呼万唤始出来 ===Visual Studio Team System 2008 Team Suite 中文版 Out!!!
  6. oracle什么是定长,数据库中定长类型(char)和变长类型(varchar2)有什么区别?
  7. win11文件夹无法删除怎么办 windows11文件夹无法删除的解决方法
  8. 【Scratch考级99图】图36-等级考试scratch绘制复杂图形中间带凸点正方形花 少儿编程 scratch画图案例教程
  9. 初级会计最后一个月稳过秘籍
  10. OBD(On-Board-Diagnose)
  11. c/c++通过域名解析ip地址
  12. PHP两种调用接口方式
  13. 使用IDEA如何将项目打包成war包
  14. Opencv学习记录(三) —— 得到图像中目标物坐标的简单处理算法(望指正与补充)
  15. 中科创达发布融合智能泊车技术于解决方案
  16. python空气质量指数计算_现在,哪个城市的空气最好闻?空气质量指数分布图——Python实例...
  17. myeclipse下用axis2开发web service
  18. MySQL EXISTS 关键字使用
  19. Linux-comm
  20. css弹性盒之justify-content详解

热门文章

  1. 小学生都能看懂的生成函数入门教程
  2. ...三个点es6用法
  3. 常用设计模式之单例模式
  4. 设计模式(一)单例模式:1-饿汉模式(Eager)
  5. [CareerCup] 18.4 Count Number of Two 统计数字2的个数
  6. ASP连接sql server实例解析
  7. cocos2d-x 播放视频 on Android
  8. Java开发笔记(一百四十七)通过JDBC管理数据库
  9. 纯CSS实现的风车转动效果特效演示
  10. 在dos窗口中删除services中的服务