声明
1 | var a=new Array(); |
判断是否为数组
1 | Array.isArray(target) |
拼接为字符串
1 | a.join("-") |
数组的增删改
添加
1 | //添加元素到数组结尾,返回新长度 |
插入另一个数组
1 | let array1 = [1, 2, 3]; |
插入
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目的数组
。
注释:该方法会改变原始数组。
插入 在index位置插入元素
1 | arr.splice(index,0,item1,item2,...); |
开始插入
1 | arr.unshift("begin"); |
结尾插入
1 | arr.push("end"); |
替换元素
注释:该方法会改变原始数组。
替换 从index开始的2个元素替换为
1 | a.splice(index,2,item1,item2,...); |
删除元素
删除索引位置元素
1 | let myArray = [1, 2, 3, 4, 5]; |
删除最后一个
注释:该方法会改变原始数组。
1 | // 改变原数组 |
pop()
方法将删除 arrayObject 的最后一个元素,
把数组长度减 1,并且返回它删除的元素的值。
如果数组已经为空,则 pop()
不改变数组,并返回 undefined 值。
从索引删除
删除 从index开始删除2个元素
1 | a.splice(index,2); |
删除第1个元素
1 | arr.splice(0,1); |
删除最后2个元素
要删除数组的最后两个元素,可以使用数组的 slice()
方法或 splice()
方法。
使用 slice()
方法:1
2
3
4let array = [1, 2, 3, 4, 5];
//不修改原数组
let newArray = array.slice(0, array.length - 2);
console.log(newArray); // [1, 2, 3]
使用 splice()
方法:1
2
3
4let array = [1, 2, 3, 4, 5];
//修改原数组
array.splice(array.length - 2, 2);
console.log(array); // [1, 2, 3]
保留前3个元素
1 | let array = [1, 2, 3, 4, 5]; |
移除对象
1 | let arr = [ |
遍历中删除数据
一般解决:此时可以在删除下标i的时候执行 i–(使下标回退一个位置)
优化解决:可以通过倒叙遍历的方法,倒叙遍历的时候不管删了多少元素,没遍历的元素不会被跳过,比上一个方法简单
一般解决方法
1 | let arr = [1,2,3]; |
优化方法
1 | for(let i=arr.length-1; i>=0; i--){ |
清空数组
方式1:splice函数
1 | arrayObject.splice(index,howmany,element1,.....,elementX) |
index:必选,规定从何处添加/删除元素。
howmany:必选,规定应该删除多少元素。未规定此参数,则删除从 index 开始到原数组结尾的所有元素。
element1:可选,规定要添加到数组的新元素。
示例:
1 | var arr = [1,2,3,4]; |
方式2:直接赋予新数组 []
1 | var arr = [1,2,3,4]; |
这种方式为将arr重新复制为空数组,之前的数组如果没有被引用,将等待垃圾回收。
方式3:给数组的length赋值为0
1 | var arr = [1,2,3,4]; |
赋予数组的长度小于本身的长度,数组中后面的元素将被截断。
赋予数组的长度大于本身的长度,将扩展数组长度,多的元素为undefined。
注意
VUE的时候不要用这种方式,会导致页面不刷新。
效率比较:
多次测试发现第3种方式最快,第1种其次,第2种最慢。
排序
会修改原数组
数组反转
1 | arr.reverse(); |
该方法会改变原来的数组,而不会创建新的数组。
单属性排序
正序:
1 | arr.sort(); |
正序:
1 | var arr = [40, 100, 1, 5, 25, 10]; |
逆序:
1 | var arr = [40, 100, 1, 5, 25, 10]; |
多属性排序
根据多个属性排序
先按type
正序,再按num
倒序
1 | arr.sort(function(a,b){ |
字符串排序
1 | arr.sort( |
如果包含中文
1 | a.localeCompare(b,'zh-CN') |
随机排序
1 | array.sort(() => Math.random() - 0.5) |
null排序
列表中的对象的属性为null的排后面。
1 | var array = [ |
深拷贝与浅拷贝
深拷贝
1 | const arr = [1, 2, 3, 4, 5]; |
浅拷贝
方式1
使用展开运算符可以轻松地复制
1 | const arr = [1, 2, 3, 4, 5]; |
方式2
使用数组的slice方法复制数组
1 | const arr = [1, 2, 3, 4, 5]; |
slice()
是数组对象的一个方法,用于从数组中提取指定位置的元素创建一个新的数组。
slice()
方法不会修改原始数组,而是返回一个浅拷贝(shallow copy)的新数组。
slice()
方法可以接收两个参数,即 start
和 end
。起始位置 start
是要提取的起始索引(包含在提取范围内),结束位置 end
是要提取的结束索引(不包含在提取范围内)。
如果省略 end
参数,默认会提取到数组的末尾。
合并两个数组
1 | a.concat(["123"]); |
concat()
方法用于连接两个或多个数组。
该方法不会改变原数组,而仅仅会返回被连接数组的一个副本。
获取数组片段
按照位置获取
不会改变原数组
1 | arrayObject.slice(start,end) |
参数
start 必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
end 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。
返回值
- 返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
获取除最后一个的其他
1 | let arr = [1,2,3,4,5]; |
获取最后一个
1 | let arr = [1,2,3,4,5]; |
随机获取2个
1 | export function getRandomTwoItems(arr) { |
判断是否包含
数组是否包含元素
1 | var arr = ["a","b","2","3","c"]; |
数组是否包含元素
1 | let animals = ["a", "b", "c", "d"] |
包含元素或属性
判断是否为数组的元素索引
或对象的属性
:
格式:(变量 in 对象)
当
对象
为数组时,变量
指的是数组的索引
;当
对象
为对象是,变量
指的是对象的属性
。
数组示例:
1 | var arr = ["a","b","2","3","str"]; |
输出为:
1 | false |
对象示例:
1 | var obj={ |
输出为:
1 | false |
判断数组包含另一数组
1 | function isArrayContained(arr1, arr2) { |
判断数组是否包含对象
1 | let animals = [{name: "dog"}, {name: "snake"}, {name: "monkey"}, {name: "donkey"}] |
遍历
1 | var arr = [1, 2, 3, 4, 5]; |
map
map()经常用来遍历数据。
map()的作用就是“映射”,也就是原数组被“映射”成对应新数组。
方法概述
map() 方法返回一个新数组,这个新数组:由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。
map() 不会对空数组进行检测。
map() 不会改变原始数组。
1 | var arr = ["a","b","c","d","e"]; |
map的参数:
- currentValue 必须。当前元素的值
- index 可选。当期元素的索引值
- arr 可选。当期元素属于的数组对象
reduce
求和
1 | let totalValue = list.reduce((total, item) => { return total + item }, 0) |
最大值
1 | let maxValue = list.reduce((max, item) => { return Math.max(max, item) }, 0) |
filter
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
注意: filter() 不会对空数组进行检测。
注意: filter() 不会改变原始数组。
1 | var ages = [32, 33, 12, 40]; |
排除数组元素的数组
1 | const array = [1, 2, 3, 4, 5]; |
some
1 | const array = [1, 2, 3, 4, 5]; |
要判断一个二维数组中是否包含另一个一维数组,你可以使用嵌套的 Array.prototype.some()
和 Array.prototype.every()
方法来实现。
首先,你可以使用 some()
方法遍历二维数组的每个子数组,然后对每个子数组使用 every()
方法来判断是否包含目标数组。
下面是一个示例:
1 | const matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; |
在上面的示例中,includesTarget
的值将根据二维数组 matrix
是否包含目标数组 targetArray
来决定。
subArray.every()
用于检查每个子数组是否与目标数组完全匹配(即元素个数和每个元素的值都相等)。
every
判断数组中不为空的都是整数
1 | let numArr = [10,8,null,10,20,100]; |
fill
1 | let arr = new Array(5); |
注意填充二位数组
1 | let dataArr = new Array(5); |
注意
这里使用JSON进行了序列化和反序列化的原因是
dataArr
中填充的数组是同一指针的数组,修改的化会全都改变。
还用一种方式
1 | let dataArr = Array.from({length: 3}, () => []); |
队列的实现
1 | // 基于数组封装队列类 |
使用
1 | // 发送消息列表 接收到消息回发后移除该消息 否则超过3秒自动重发 |
这种情况会出现一个问题
如果在断网时发送消息,这个消息会在队列中,当重连时,会发送之前的消息,并且发送上线的消息,可能先收到的是上线消息的返回,但是上线消息不是在队列的顶部所以没有移除,就会出现问题。
解决方法
发消息依旧按照队列发送,但是接收消息的时候只要在数组中都移除。
示例
1 | // 发送消息列表 接收到消息回发后移除该消息 否则超过3秒自动重发 |