JS算法必备之Array常用操作方法

简介: 这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。

MDN参考文档: Array - JavaScript | MDN

①数组**创建**的基本方式有两种:

  • 使用Array构造函数

var colors= new Array();

var colors= new Array(20); //传递数组长度,该数会自动变成length属性的值

var colors= new Array("red","blue","green");

var colors=new Array(3); //创建包含3项的数组

var names=new Array("Curry"); //创建包含1项,即字符串"Curry"的数组

var names=new Array(5).fill(0) // [0, 0, 0, 0, 0]

创建数组可以省略new操作符

var colors=Array(3); //创建包含3项的数组

var names=Array("Curry"); //创建包含1项,即字符串"Curry"的数组

  • 数组字面量表示法:由一对包含数组项的方括号表示,多个数组项之间以逗号隔开。

var colors=["red","blue","green"]; //创建一个包含3项的数组

var names=[]; //创建一个空数组

var values=[1 , 2 ,]; //不要这样!在最后一项添加逗号,会创建一个包含2或3项的数组

var options=[, , , , ,]; //不要这样!因为会创建一个包含5或6项的数组

②数组检测

var colors = [ 'red', 'blue', 'green']

ECMAScript5新增Array.isArray()方法,目的是最终确定某个值到底是不是数组:

if (Array.isArray(colors)) {

    // 对数组执行某些操作

}

③数组转换

var colors = ['red', 'blue', 'green']

console.log(colors.toString()) // 'red,blue,green',返回数组中每个值的字符串形式拼接成的以逗号分隔的字符串。

console.log(colors.valueOf()) // [ 'red', 'blue', 'green'],返回的是数组本身

数组继承的toLocalString()、toString()和valueOf()方法,在默认情况下,都会以逗号分隔的字符串形式返回数组项。

而使用join()方法,可以使用不同的分隔符来构建这个字符串。

join()方法只接收一个参数:用作分隔符的字符串

console.log(colors.join(',')) // red,green,blue

console.log(colors.join('')) // redgreenblue

console.log(colors.join('||')) // red||green||blue

若不给join()方法传递任何值,或者给它传入undefined,则使用逗号作为分隔符。

④数组的栈方法(**LIFOLast-In-First-Out后进先出**的数据结构)

栈的插入和移除,只发生在栈的顶部。

1.push():可以接收任意数量的参数,将其逐个添加到数组末尾,并返回修改后数组的长度

2.pop():从数组末尾移除最后一项,减少数组的length,返回移除的项

var colors = new Array() // create an array

var count = colors.push('red', 'green') //插入两项

console.log(count) // 2

count = colors.push('black') // 插入另一项

console.log(count) // 3

var item = colors.pop() // 取得最后一项

console.log(item) // 'black'

⑤数组的队列方法(**FIFOFirst-In-First-Out**,先进先出的数据结构)

队列在列表的末端添加项,从列表的前端移除项。可以使用以下两种组合,像使用队列一样使用数组:

1.shift():移除数组中的第一项并返回该项,同时数组length减1

var colors = [ 'red', 'blue', 'green']

var item = colors.shift() // 取得第一项

console.log(item) // 'red'

console.log(colors.length) // 2

2.unshift():在数组前端添加任意个项并返回新数组的长度

var colors = new Array() // create an array

var count = colors.unshift("red", "green") // 插入两项

console.log(count); // 2

⑥数组排序方法

1.reverse():翻转数组

var values = [1,2,3,4,5]

console.log(values.reverse()) // [5, 4, 3, 2, 1],翻转数组的顺序

2.sort():对数组进行排序

默认情况下,sort()方法按升序排列数组项——即最小的值位于最前面。为了实现排序,sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,即使数组项是数值,sort()方法比较的也是字符串

var values = [0, 1, 15, 5, 10]

console.log(values.sort()) // 0,1,10,15,5 默认进行字符串比较,所有10和15都在5的前面

若想通过sort()得到降序或者升序,可以传递一个比较函数

console.log(values.sort((a, b) => a - b))

function compare (a, b) {

    **return a - b // 升序**

    **return b - a // 降序**

}

function compare (a, b) { // 升序

    if ( a < b) {

            return -1

    } **else if (a > b) {**

            **return 1**

    } else {

            0

}

function compare (a, b) { // 降序

    **if (a < b) {**

            **return 1**

    } else if (a > b) {

            return -1

    } else {

            0

    }

}

⑦数组**操作方法**

1.concat():基于当前数组中的所有项创建一个新数组

  • 在没有传参时,它只是复制当前数组并返回副本
  • 如果传递的是1个或多个数组,则会将这些数组中的每一项都添加到结果数组中
  • 如果传递的值不是数组,这些值就会被简单地添加到结果数组的末尾

var colors = ['red', 'green', 'blue']

var colors2 = colors.concat('yellow', ['black', 'brown'])

console.log('colors2:', colors2) // ['red', 'green', 'blue', 'yellow', 'black', 'brown']

2.slice():不改变原数组**,**返回一个新的数组,包含从 start 到 end (不包括该元素)的 元素

slice() 方法可从已有的数组中返回选定的元素。

slice()方法可提取字符串的某2个部分,并以新的字符串返回被提取的部分。

注意: slice() 方法不会改变原始数组。

语法:array.slice(start, end)

参数

描述

start

可选。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取,slice(-2) 表示提取原数组中的倒数第二个元素到最后一个元素(包含最后一个元素)

end

可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果该参数为负数, 则它表示在原数组中的倒数第几个元素结束抽取。 slice(-2,-1) 表示抽取了原数组中的倒数第二个元素到最后一个元素(不包含最后一个元素,也就是只有倒数第二个元素)。

  • 只有一个参数时:返回从该参数指定位置开始到当前数组末尾的所有项。
  • 有两个参数时:返回起始和结束位置之间的项,不包括结束位置的项。

var nums = [1, 2, 3, 4, 5]

var nums1 = nums.slice(1) // 2, 3, 4, 5

var nums2 = nums.slice(1, 4) // 2, 3, 4

3.splice():算是最强大的数组方法,主要用途是向数组的中部插入项。

  • 删除任意数量的项,2个参数

splice(0,2); // 0**:要删除的第一项位置;2:要删除的项数**

  • 插入指定位置任意数量的项,3个参数

splice(2, 0, 'red', 'green') // 2**:起始位置;0:要删除的项数;要插入的项**

  • 替换,向指定位置插入任意数量的项,同时删除任意数量的项,3个参数

splice(2, 1, 'red', 'green') // 2**:起始位置;1:要删除的项数;要插入的任意数量的项**

splice()方法会改变原数组,同时返回一个数组,包含从原始数组中删除的项,若未删除,则返回一个空数组。

var colors = ['red', 'green', 'blue']

var removed = colors.splice(0,1) // 删除第一项

alert(colors) // ['green, blue']

alert(removed) // ['red'],返回数组中只包含一项

4.flat():参数默认值为1,按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回

var nums = [1, 2, [3, [4]], 5]

console.log(nums.flat(0)) // [1, 2, [3, [4]], 5]

console.log(nums.flat(1)) // [1, 2, 3, [4], 5]

console.log(nums.flat(2)) // [1, 2, 3, 4, 5]

⑧数组位置方法

indexOf()和lastIndexOf()均接收两个参数:

Ⅰ.要查找的项

Ⅱ.(可选)表示查找起点位置的索引

两个方法查找成功都返回该项在数组中的位置,没找到时返回-1

1.indexOf():从数组的开头(位置0)开始向后查找

var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1]

console.log(numbers.indexOf(4)) // 3

console.log(numbers.indexOf(4, 4)) // 5

2.lastIndexOf():从数组的末尾开始向前查找

console.log(numbers.lastIndexOf(4)) // 5

console.log(numbers.lastIndexOf(4, 4)) // 3

3.at():方法接收一个整数值并返回该索引的项目,允许正数和负数。负整数从数组中的最后一个项目开始倒数。

var nums = [1, 2, 3, 4, 5]

console.log(nums.at(0)) // 1

console.log(nums.at(1)) // 2

console.log(nums.at(-1)) // 5

⑨数组归并方法

ECMAScript5新增了两个归并数组的方法:reduce()和reduceRight()

这两个方法都接收两个参数:

Ⅰ.在每一项上调用的函数。

Ⅱ.(可选)作为归并基础的初始值。

传给这两个方法的函数接收4个参数:

Ⅰ.acc累计器(累计回调的返回值,是上一次调用回调时返回的累积值)

Ⅱ.cur当前值

Ⅲ.index当前值的索引

Ⅳ.array数组对象

1.reduce():从数组第一项开始,逐个遍历到最后

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

reduce() 可以作为一个高阶函数,用于函数的 compose。

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

语法:array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

参数

描述

function(total,currentValue, index,arr)

必需。用于执行每个数组元素的函数。

函数参数:

参数

描述

total

必需。初始值, 或者计算结束后的返回值

currentValue

必需。当前元素

currentIndex

可选。当前元素的索引

arr

可选。当前元素所属的数组对象。

initialValue

可选。传递给函数的初始值

  • 直接对数组值进行累加

var nums = [1, 2, 3, 4, 5]

var result = nums.reduce((a, b) => a + b, 10) // 10为初始值

console.log('result:', result) // 累加结果:16

var sum = nums.reduce((pre, cur) => {

  return pre + cur

}, 10) // 10为初始值

console.log(sum) // 25

  • 对数组值先进行四舍五入,然后再进行累加

var nums = [1.1, 2.2, 3.3, 4.4, 5.5]

var result = nums.reduce((a, b) => a + Math.round(b), 0.5)

console.log('result:', result) // 此时0.5作为初始累加结果,数组所有项四舍五入累加,最终结果为:16.5

2.reduceRight():从数组的最后一项开始,向前遍历到第一项

⑩数组迭代方法

传入这些方法中的函数均会接收3个参数:

Ⅰ.item(必须):数组项的值

Ⅱ.index(可选):该项在数组中的位置

Ⅲ.array(可选):数组对象本身

var typeKey = [0, 1, 2, 3, '']

1**.filter()**:返回该函数会返回true的项组成的数组(常用于过滤空数组项

typeKey= typeKey.filter(item => {

            return item !== ''

    })

console.log('typeKey:', typeKey) // [0, 1, 2, 3]

2**.forEach()**:对数组每一项执行一遍回调函数(没有返回值)

typeKey**.**forEach(item => {

    if (item) {

            console.log(item)

    }

})

3**.map()**:返回每次函数调用的结果组成的数组(常用于处理数组项

map() 方法:

1.返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。

2.按照原始数组元素顺序依次处理元素。

注意: map() 不会对空数组进行检测。

注意: map() 不会改变原始数组。

var result = typeKey**.**map(item => {

    if (item) {

            return 1

    } else {

            return 0

    }

})

console.log('result:', result) // [0, 1, 1, 1, 0]

按条件删除数组某些的对象中的某些字段

this.types.map(item => {

    **if (item.value === '2') {**

            **return delete item.value**

    **} else {**

            **return item**

    **}**

})

console.log('types:', this.types)

4**.every()**:用于检测数组所有元素是否都符合指定条件(通过函数提供)。

every() 方法使用指定函数检测数组中的所有元素:

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

注意: every() 不会对空数组进行检测。

注意: every() 不会改变原始数组。

语法:array.every(function(currentValue,index,arr), thisValue)

var result = typeKey.every((item, index, array) => {

            return item>2

    }) // 数组所有项均大于2,即都返回true,则最后返回true

var result = typeKey.every(item => item > 2)

console.log('result:', result) // false

5**.some()**:用于检测数组中的元素是否满足指定条件(函数提供)

some() 方法会依次执行数组的每个元素:

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

注意: some() 不会对空数组进行检测。

注意: some() 不会改变原始数组。

语法:array.some(function(currentValue,index,arr),thisValue)

var result = typeKey.some((item, index, array) => {

            return item>2

    }) // 数组存在大于2的项,则最后返回true

var result = typeKey.some(item => item > 2)

console.log('result:', result) // true

6**.**find():返回通过测试(函数内判断)的数组的第一个元素

find() 方法为数组中的每个元素都调用一次函数执行:

  • 当数组中的元素在测试条件时返回 true 时, find() 返回符合条件的元素,之后的值不会再调用执行函数。
  • 如果没有符合条件的元素返回 undefined

注意: find() 对于空数组,函数是不会执行的。

注意: find() 并没有改变数组的原始值。

语法:array.find(function(currentValue, index, arr),thisValue)

var types = [

    {

            name: '单选题',

            value: 1

    },

    {

            name: '多选题',

            value: 2

    },

    {

            name: '判断题',

            value: 3

    }

]

var result = types.find(item => item.value === 3)

console.log('result:', result)

7**.findIndex()**:返回传入一个测试条件(函数)符合条件的数组第一个元素的位置索引。

findIndex() 方法为数组中的每个元素都调用一次函数执行:

  • 当数组中的元素在测试条件返回 true 时, findIndex() 返回符合条件的元素的索引位置,之后的值不会再调用执行函数。
  • 如果没有符合条件的元素返回 -1

注意: findIndex() 对于空数组,函数是不会执行的。

注意: findIndex() 并没有改变数组的原始值。

语法:array.findIndex(function(currentValue, index, arr), thisValue)

var types = [

    {

            name: '单选题',

            value: 1

    },

    {

            name: '多选题',

            value: 2

    },

    {

            name: '判断题',

            value: 3

    }

]

var result = types.find**Index**(item => item.value === 3)

console.log('result:', result) // 索引:2

8.for…****for…of和for…in

var nums = [1, 2, 3, 4]

for (let i = 0; i < str.length; i++) {

  console.log(str\[i\]) // 字符串每项的值

}

for (const n of nums) {

  console.log('item:', n) // 数组每项的值

}

for (const i in nums) {

  console.log('index:', 'i) // 数组每项的索引下标(string类型)

}

⑪includes():用来判断一个数组是否包含一个指定的值(或者判断字符串是否包含指定的子字符串),如果是返回 true,否则false

var nums = [1, 2, 3]

nums.includes(2) // true

num.includes(4) // false

var site = ['runoob', 'google', 'taobao']

site.includes('runoob') // true

site.includes('baidu') // false

相关文章
|
7月前
|
存储 监控 算法
局域网监控其他电脑的设备信息管理 Node.js 跳表算法
跳表通过分层索引实现O(logn)的高效查询、插入与删除,适配局域网监控中设备动态接入、IP映射及范围筛选等需求,相比传统结构更高效稳定,适用于Node.js环境下的实时设备管理。
240 9
|
8月前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
243 6
|
8月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
578 0
|
9月前
|
机器学习/深度学习 数据采集 传感器
具有多种最大功率点跟踪(MPPT)方法的光伏发电系统(P&O-增量法-人工神经网络-模糊逻辑控制-粒子群优化)之使用粒子群算法的最大功率点追踪(MPPT)(Simulink仿真实现)
具有多种最大功率点跟踪(MPPT)方法的光伏发电系统(P&O-增量法-人工神经网络-模糊逻辑控制-粒子群优化)之使用粒子群算法的最大功率点追踪(MPPT)(Simulink仿真实现)
584 0
|
9月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
307 0
|
11月前
|
JavaScript Linux 内存技术
Debian 11系统下Node.js版本更新方法详解
本指南详细介绍在Linux系统中安装和管理Node.js的步骤。首先检查现有环境,包括查看当前版本和清除旧版本;接着通过NodeSource仓库安装最新版Node.js并验证安装结果。推荐使用nvm(Node Version Manager)进行多版本管理,便于切换和设置默认版本。同时,提供常见问题解决方法,如权限错误处理和全局模块迁移方案,以及版本回滚操作,确保用户能够灵活应对不同需求。
1302 0
|
7月前
|
存储 监控 JavaScript
企业上网监控系统的恶意 URL 过滤 Node.js 布隆过滤器算法
布隆过滤器以低内存、高效率特性,解决企业上网监控系统对百万级恶意URL实时检测与动态更新的难题,通过概率性判断实现毫秒级过滤,内存占用降低96%,适配大规模场景需求。
376 3
|
7月前
|
存储 监控 算法
电脑管控软件的进程优先级调度:Node.js 红黑树算法
红黑树凭借O(log n)高效插入、删除与查询特性,适配电脑管控软件对进程优先级动态调度的高并发需求。其自平衡机制保障系统稳定,低内存占用满足轻量化部署,显著优于传统数组或链表方案,是实现关键进程资源优先分配的理想选择。
338 1
|
8月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
429 3
|
11月前
|
JavaScript Linux 内存技术
Debian 11系统下Node.js版本更新方法
Debian 11更新Node.js主要就是这三种方式,无论你是初涉其中的新手还是找寻挑战的专家,总有一种方式能满足你的需求。现在,你已经是这个
1304 80