数组操作详解

最近整理笔记,发现数组的笔记较为松散,索性将知识整合写出来这篇文章,为了有助于理解,作者将每个api都写了例子有助于理解,希望本篇文章能对你有所帮助。

创建数组的方法

// 构造数组
var a = new Array(); // 空数组
var a = new Array(1, ar, arr) // 实数组

// 数组直接量
var a = [];  //空数组
var a = [1, "0", arr];  //实数组

对数组的操作

ES6新语法

Array.of()

Array.of() 方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型。
Array.of()Array 构造函数之间的区别在于处理整数参数:Array.of(3)创建一个具有单个元素 3 的数组,而 Array(3) 创建一个长度为3的空数组

目的:Arrat.of()是为了解决构造数组因参数个数不同,导致的行为差异

var a = new Array(3);
console.log(a);   //VM109:2 (3) [空 ×3]

var a = Array.of(3);
console.log(a); // [3]

Array.from()

Array.from() 方法对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。(不改变原对象返回新的数组)

参数

  1. (必需):转为数组的对象。
  2. (可选):作用类似map方法,可以对每个元素进行处理,每个元素会执行该回调函数。
  3. (可选):执行回调函数this绑定的对象
let arr = [1, 2, 3, 4, 5]
let set = new Set(arr)
console.log(Array.from(set, item => item + 1)) // [ 2,3,4,5,6 ]

改变原数组

splice()

作用 :对数组进行添加或删除操作,然后返回改变的数组

参数

  1. index:必需,添加或删除项目的位置,可以为负数(从后往前)
  2. howmany:可选,表示要删除的数量
  3. item:可选,要添加到数组的新项目
let a = [1, 2, 3, 4, 5]
let item = a.splice(1, 2) //[2,3]
console.log(a);   // [1,4,5]  在下标1的位置往后删除两个元素
let item1 = a.splice(-2, 3)  //[4,5]
console.log(a);   // [1] 在下标倒数第二个的位置也就是元素 4 ,往后删除3个元素

sort

作用 :对数组的元素进行排序,并返回数组

array.sort((a,b)=>a-b) 升序

array.sort((a,b)=>a+b) 降序

pop()

作用 :删除数组中的最后一个元素

let a = [1, 2, 3, 4, 5]
let item = a.pop()  //5
console.log(a);  // [1,2,3,4]

shift()

作用 :删除数组的第一个元素

let a = [1, 2, 3, 4, 5]
let item = a.shift()  //1
console.log(a);  // [2,3,4,5]

unshift()

作用 :向数组的开头添加一个或多个元素,并返回新的长度

let a = [1, 2, 3, 4, 5]
let item = a.unshift(0)
console.log(a);  // [0,1,2,3,4,5]

push()

作用 :向末尾添加一个或多个元素,并返回新长度

let a = [1, 2, 3, 4]
let item = a.push(5, 6)
console.log(a);  // [1,2,3,4,5,6]

reserve()

作用 :颠倒数组中元素的顺序

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

copyWithin()

作用 :指定位置的成员复制到其他位置

参数

  1. target:必需,替换数据的位置
  2. start:可选,读取数据位置(默认为0)
  3. end:可选,停止读取数据位置,默认为数组长度
let a = [1, 2, 3, 4, 5, 6]
a.copyWithin(0, 2, 5)
console.log(a); // [3,4,5,4,5,6]
注意
  1. 读取数据为左闭右开

  2. 数组长度不变,读取了多少数据就会在替换位置开始替换多少个元素

  3. 从target位置开始往后替换数据

fill()

作用 :填充数组

参数

  1. 必需,填充数组的值
  2. 可选,填充开始的位置(默认为0)
  3. 可选,填充的结束位置(默认为数组长度)
let a = [1, 6, 8]
a.fill(2)
console.log(a); // [2,2,2]

let a = [1, 6, 8]
a.fill(2, 0, 1)
console.log(a); // [2,6,8]
注意
  1. 如果数组位置有数据,会被填充的数据替换
  2. 填充位置为左闭右开

不改变原数组

slice()

作用 :浅拷贝数组

参数

  1. begin:可选,提取元素的初始位置
  2. end:可选,提取元素的结束位置
// 简单数据类型为浅拷贝,改变之后互不影响
let a = [1, 6, 8, 9]
let b = a.slice(0, 3)  // [1,6,8]
a[0] = 3
console.log(a);  // [3,6,8,9]
console.log(b);  // [1,6,8]

//复杂数据类型例如对象会改变
let a1 = [{ name: 'Bob', age: 18 }, { name: 'Mary', age: 20 }]
let b1 = a1.slice(1)
a1[1].name = 'Mark'
console.log(a1);  // [ { name: 'Bob', age: 18 }, { name: 'Mark', age: 20 } ]
console.log(b1);  // [ { name: 'Mark', age: 20 } ]
注意

字符串也有slice方法

var str = 'Hello World'
let str1 = str.slice(1, 7)
console.log(str1);  // 'ello W'  空格也占位置
console.log(str);   //  'Hello World'

join()

作用 :数组转字符串,将数组中的所有元素通过指定分隔符进行分割放入

参数

str:指定要使用的分隔符,默认使用逗号

let arr = [1, 2, 3, 4, 5]
let str = a.join('')
console.log(str); // '123345'
//拿取数组中的元素再通过指定分割符隔开放入字符串中

let a = [['Bob', '23'], 'str'];
let str1 = a.join(); // "Bob,23,str"
let b = [{ name: 'Bob', age: '23' }, 'str'];
let str2 = b.join(); // "[object Object],str"
//数组元素是数组的时候,会将里面的数组也调用join() / toString() ,如果是对象的话会被转为`[object Object]`字符串

toLocaleString()

作用 :返回一个表示数组元素的字符串。该字符串由数组中的每个元素的 toLocaleString() 返回值经调用join()方法连接组成

var a = new Date();
let b = a.toLocaleString()
console.log(b);  // '2022/2/7 上午10:55:44'
console.log(a);  //  '2022-02-07T02:57:04.573Z'

toString()

作用 :数组转字符串,把数组转为由逗号链接起来的字符串

相比于join() 没有优势,不推荐使用

concat()

作用 :合并数组,并返回一个新的数组

let a = [1, 2, 3];
let b = [4, 5, 6];
//连接两个数组
let newVal=a.concat(b); // [1,2,3,4,5,6]
// 连接三个数组
let c = [7, 8, 9]
let newVal2 = a.concat(b, c); // [1,2,3,4,5,6,7,8,9]
// 添加元素
let newVal3 = a.concat('添加元素',b, c,'再加一个'); 
// [1,2,3,"添加元素",4,5,6,7,8,9,"再加一个"]

indexOf()

作用 :查找数组是否存在某个元素,返回下标

参数

  1. searchElement:必需,被查找的元素
  2. fromIndex:可选,开始查找的位置(不能大于等于数组的长度),接受负值,默认值为0
let a = ['Bob', [2, 3], 4, 4, 24, 7]
console.log(a.indexOf(2));  // -1 
console.log(a.indexOf('7'));  // -1
console.log(a.indexOf(7));  // 5
console.log(a.indexOf('Bob')); // 0
console.log(a.indexOf([2, 3]));  // -1
注意
  1. 数组的indexOf搜索跟字符串的indexOf不一样,数组的indexOf使用严格相等===搜索元素,即数组元素要完全匹配才能搜索成功。

  2. indexOf() 不能识别NaN

lastIndexOf()

作用 :查找指定元素在数组中的最后一个位置

参数

  1. searchElement:必需,被查找的元素

  2. fromIndex:可选,逆向开始查找位置,默认值数组的-1。正值:从该值往前查找(如果大于或等于数组长度则查找整个数组)。 负值:绝对值大于数组长度则返回 -1

let a = ['Bob', [2, 3], 4, 4, 24, 7]
console.log(a.lastIndexOf(2));  // -1 
console.log(a.lastIndexOf(4)); //3
console.log(a.lastIndexOf(4, -4)); //2

includes()

作用 :查找数组是否包含某个元素 返回布尔

参数

  1. searchElement:必需,被查找的元素
  2. fromIndex:可选,默认值为0,参数表示搜索的起始位置,接受负值。正值超过数组长度,数组不会被搜索,返回false。负值绝对值超过长数组度,重置从0开始搜索
注意

includes是为了弥补indexOf出现的

  1. indexOf方法不能识别NaN

  2. indexOf方法检查是否包含某个值不够语义化,需要判断是否不等于-1,表达不够直观

let a = ['Bob', [2, 3], NaN, 4, 24, 7]
console.log(a.includes(2));  // false
console.log(a.includes([2, 3])); // false
console.log(a.includes(NaN)); // true
console.log(a.includes(4, -10)); // true
console.log(a.includes(4, -3)); // true


数组的遍历

遍历数组的方法

forEach

作用 :按升序为数组中含有效值的每一项执行一次回调函数

参数

  1. function:必需,数组中每个元素调用的函数
  • currentValue:必需,数组当前元素的值
  • index:可选,当前元素的索引值
  • arr:可选,数组对象本身
  1. thisValue:可选,当执行回调函数时this绑定对象的值,默认值为undefined
注意
  • forEach无法中途退出循环,只能用return退出本次回调,进行下一次回调
  • forEach没有返回值,即使return了一个值

every

作用 :检测数组所有元素是否都符合判断条件

参数

  1. function:必需,数组中每个元素调用的函数
  • currentValue:必需,数组当前元素的值
  • index:可选,当前元素的索引值
  • arr:可选,数组对象本身
  1. thisValue:可选,当执行回调函数时this绑定对象的值,默认值为undefined
注意
  • 如果数组中检测到有一个元素不满足,则整个表达式返回 false,且剩余的元素不会再进行检测
  • 如果所有元素都满足条件,则返回 true
function isBigEnough(a) {
    return a >= 10;
    // 判断数组中的所有元素是否都大于10 } 
}
let result = [12, 5, 8, 130, 44].every(isBigEnough); // false 
let result = [12, 54, 18, 130, 44].every(isBigEnough); // true 

// 接受箭头函数写法 
[12, 5, 8, 130, 44].every(x => x >= 10); // false 
[12, 54, 18, 130, 44].every(x => x >= 10); // true

some

作用 :数组中的是否有满足判断条件的元素

参数

  1. function:必需,数组中每个元素调用的函数
  • currentValue:必需,数组当前元素的值
  • index:可选,当前元素的索引值
  • arr:可选,数组对象本身
  1. thisValue:可选,当执行回调函数时this绑定对象的值,默认值为undefined
注意
  • 如果有一个元素满足条件,则表达式返回true, 剩余的元素不会再执行检测。
  • 如果没有满足条件的元素,则返回false
function isBigEnough(a) {
    return a >= 10;
    // 判断数组中是否有元素大于10 } 
}
let result = [1, 5, 8].some(isBigEnough); // false 
let result1 = [12, 54, 18].some(isBigEnough); // true 

// 接受箭头函数写法
[12, 5, 8, 130, 44].some(x => x >= 10); // false
[12, 54, 18, 130, 44].some(x => x >= 10); // true

filter

作用 :过滤原始数组,返回新数组

参数

  1. function:必需,数组中每个元素调用的函数
  • currentValue:必需,数组当前元素的值
  • index:可选,当前元素的索引值
  • arr:可选,数组对象本身
  1. thisValue:可选,当执行回调函数时this绑定对象的值,默认值为undefined
let a = [1, 2, 4, 9]
let result = a.filter(a => a > 3)
console.log(result); //[4,9]

map

作用 :对数组中的每个元素进行处理,返回新的数组

参数

  1. function:必需,数组中每个元素调用的函数
  • currentValue:必需,数组当前元素的值
  • index:可选,当前元素的索引值
  • arr:可选,数组对象本身
  1. thisValue:可选,当执行回调函数时this绑定对象的值,默认值为undefined
let a = [1, 2, 4, 9]
let result = a.map(a => a + 3)
console.log(result); //[4,5,7,12]
注意

map和forEach都能进行遍历,但与mpa不同的是forEach不能return,即forEach会改变原数组,map可以生成一个新的数组

reduce

作用 :为数组提供累加器,合并为一个值

参数

  1. function:必需,数组中每个元素需要调用的函数
  • total:必需,初始值或者上一次调用回调返回的值
  • currentValue:必需,数组当前元素的值
  • index:可选,当前元素的索引值
  • arr:可选,数组对象本身
  1. initialValue:可选,指定第一次回调的第一个参数
注意
  • 如果initialValue有值,那么第一个total的值为initialValue,此时currentValue等于数组中的第一个值
  • 如果initialValue未提供,那么total等于数组中的第一个值,currentValue为数组中的第二个值
let a = [1, 3, [2, 5], 7]
let b = a.reduce(function (a, b) {
    return a.concat(b)
}, [])
console.log(b);  //  1, 3, 2, 5, 7 ]
let c = b.reduce((a, b) => a + b, 2)
console.log(c);  // 20

find() findIndex()

作用 :根据条件找到数组成员
参数

  1. function:必需,数组中每个元素调用的函数
  • currentValue:必需,数组当前元素的值
  • index:可选,当前元素的索引值
  • arr:可选,数组对象本身
  1. thisValue:可选,当执行回调函数时this绑定对象的值,默认值为undefined
注意

这两个方法都可以识别NaN,弥补 indexOf 的不足

 // find
let a = [1, 4, -7, 22].find((n) => n < 0); // 返回索引-7
let b = [1, 4, -7, 22, NaN].find((n) => Object.is(NaN, n));  // 为true时返回NaN
// findIndex
let a = [1, 4, -7, 22].findIndex((n) => n < 0); // 返回索引2
let b = [1, 4, -7, 22, NaN].findIndex((n) => Object.is(NaN, n));  // weitrue时返回索引4

参照文章

【干货】js 数组详细操作方法及解析合集 - 掘金 (juejin.cn)

总结

最近也在准备面试,将数组的方法再次进行了总结并且产出了文章,在写文章的同时也感觉到对知识更深入了解。感谢大佬们的文章,他们的知识对我的学习起着至关重要的作用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值