javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JavaScript数组操作

一文分享15个JavaScript中常用的数组操作方法

作者:叫我欧文就好啦

本文详细介绍了JavaScript中的常用数组操作方法,包括增删改查操作并介绍了数组操作高阶函数,这些操作和函数可以帮助高效地处理和操作数组数据,希望对大家有所帮助

数组的增删改查

1.push(插入的元素<可传多个>)

作用:往数组的尾部插入元素**

let arr = [1, 2, 3]
arr.push(4, 5)
let res = arr.push(4, 5) //返回值为插入元素后数组的长度(res:5)
console.log(arr) // [1, 2, 3, 4, 5]

2.unshift(插入的元素<可传多个>)

作用:往数组的头部插入元素**

let arr = [1, 2, 3]
arr.unshift(-2, -1, 0)
let res = arr.unshift(-2, -1, 0) //返回值为插入元素后数组的长度(res:6)
console.log(arr) // [-2, -1, 0, 1, 2, 3]

3.pop()

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

let arr = [1, 2, 3]
arr.pop()
let res = arr.pop() // 返回值为删除的元素(res: [3])
console.log(arr) // [1, 2]

4.shift()

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

let arr = [1, 2, 3]
arr.shift()
let res = arr.shift() // 返回值为删除的元素(res: [1])
console.log(arr) // [2, 3]

5.slice(开始元素的下标,结束元素的下标)

作用:截取数组特定元素(不改变原数组,可用作浅拷贝)**

// 浅拷贝
let arr = [1, 2, 3]
let newArr = arr.slice() // 返回值为截取后的新数组
console.log(newArr) // [1, 2, 3] 

//截取元素
let arr = [1, 2, 3]
let newArr = arr.slice(0, 2) // 从第下标为0的元素开始截取,到元素下标为2的元素(注:但不包括元素下标为2的元素)
console.log(newArr) // [1, 2]
console.log(arr) // [1, 2, 3] // 不改变原数组

6.splice(开始元素的下标,删除的元素个数,添加的元素...)

作用:可新增元素或者删除元素**

// 新增元素
let arr = [1, 3, 5]
arr.splice(1, 0, 2) // 在元素下标为1的元素后面新增一个元素2
let res = arr.splice(1, 0, 2) // 由于此处为新增元素,返回值为空数组[](res: []) 
console.log(arr) // [1, 2, 3, 5]

//删除元素
let arr = [1, 2, 3]
arr.splice(1, 1) // 在元素下标为1的元素后面删除一个元素
let res = arr.splice(1, 1) // 返回值为删除的元素(res: [2])
console.log(arr) // [1, 3]

7.join(传入分割每个元素的标志)

作用:数组转换为字符串**

let arr = ['zbw', 'cyl']
let res = arr.join(',') 
console.log(res) // 'zbw, cyl'

let res = arr.join('-')
console.log(res) // 'zbw-cyl'

8.concat()

作用:连接多个数组或值**

let arr1 = [1, 2, 3]
let arr2 = [4, 5, 6]

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

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

操作数组的高阶函数

高阶函数:把函数作为参数传入或把函数作为返回值的函数为高阶函数

1.map()

作用:操作数组,返回经过处理后的数组**

let arr = [1, 2, 3, 4]
let res = arr.map(item =&gt; item * 2)
console.log(res) // [2, 4, 6, 8]

2.filter()

作用:过滤数组,返回操作表达式为true的数组元素**

let arr = [1, 2, 3, 4]
let res = arr.filter(item =&gt; item &gt;= 2)
console.log(res) // [2, 3, 4]

3.reduce(pre<初始值>, cur<当前项>, arr<数组本身>, <初始值>)

作用:求和,数组转对象**

// 求和
let arr = [1, 2, 3, 4]
let res = arr.reduce((pre, cur) =&gt; {
  return pre += cur
}, 0) // 这里是求和 所以初始值为0
console.log(res) // 10

// 数组转对象
let arr = [
  { id: 1, name: 'zbw', age: 18 },
  { id: 2, name: 'cyl', age: 18 },
]

let obj = arr.reduce((pre, cur) =&gt; {
   pre[cur.id] = cur.name
   return pre
}, {}) // 这里是数组转对象 所以初始值为空对象{}

console.log(obj) // {1: 'zbw', 2: 'cyl'} 

4.forEach()

作用:跟map()作用类似,区别在于forEach()会改变原数组,且没有返回值**

let arr = [
  { name: 'zbw', age: 22 },
  { name: 'cyl', age: 18 },
]

arr.forEach(item =&gt; item.age = 20)
console.log(arr) // [{ name: 'zbw', age: 20 },{ name: 'cyl', age:20 }]

5.some()

作用:判断数组中是否存在符合条件表达式的条件,如果有一项符合返回true,否则返回false**

let arr = [1, 2, 3, 4]
let bool = arr.some(item =&gt; item &gt; 2)
console.log(bool) // true 因为存在大于2的元素

let bool = arr.some(item =&gt; item &gt; 5)
console.log(bool) // false 因为不存在大于5的元素

6.every()

作用:判断数组中是否全部元素都符合表达式的条件,全部都符合返回true,否则返回false**

let arr = [1, 2, 3, 4]
let bool = arr.every(item =&gt; item &gt; 0)
console.log(bool) // true 因为所有元素都大于0

let bool = arr.every(item =&gt; item &gt; 1)
console.log(bool) // false 因为存在不大于1的元素

7.find()

作用:找到数组中符合条件的第一个元素**

let arr = [{ id: 1, name: 'zbw', age: 18 }, { id: 2, name: 'cyl', age: 18 }]

let res = arr.find(item =&gt; item.age === 18)
console.log(res) // { id: 1, name: 'zbw', age: 18 }

let res = arr.find(item =&gt; item.id === 2)
console.log(res) // { id: 2, name: 'cyl', age: 18 }

知识扩展

数组是 JavaScript 中最基础、最常用的数据结构之一。JavaScript 提供了丰富的方法来操作数组,熟练使用这些方法可以极大提升开发效率和代码可读性。本文将按功能分类,详细介绍最常用的数组操作方法。

数组的创建与判断

方法说明示例
Array.from()将类数组或可迭代对象转换为真数组Array.from('abc') → ['a','b','c']
Array.of()将参数列表作为数组元素Array.of(3) → [3](避免 new Array(3) 的空位问题)
Array.isArray()判断一个值是否为数组Array.isArray([]) → true

添加/删除元素

方法说明返回值是否修改原数组
push(item1, item2, ...)末尾添加一个或多个元素新数组长度✅ 是
pop()删除末尾最后一个元素被删除的元素✅ 是
unshift(item1, item2, ...)开头添加一个或多个元素新数组长度✅ 是
shift()删除开头第一个元素被删除的元素✅ 是
splice(start, deleteCount, ...items)从 start 位置删除 deleteCount 个,可再插入新元素被删除元素的数组✅ 是
let arr = [1, 2, 3];
arr.push(4);        // [1,2,3,4]
arr.pop();          // 4,arr变为[1,2,3]
arr.unshift(0);     // [0,1,2,3]
arr.shift();        // 0,arr变为[1,2,3]
arr.splice(1, 1, 'a', 'b'); // 从索引1删除1个元素,然后插入'a','b' → [1,'a','b',3]

访问与查找元素

方法说明返回值查找依据
indexOf(item, fromIndex)查找元素首次出现的位置索引(未找到返回 -1)严格相等 ===
lastIndexOf(item, fromIndex)从后向前查找索引(未找到返回 -1)严格相等
includes(item, fromIndex)判断数组是否包含某元素true / false严格相等
find(callback)返回第一个满足测试函数的元素元素值或 undefined自定义条件
findIndex(callback)返回第一个满足测试函数的元素索引索引或 -1自定义条件
let arr = [1, 2, 3, 2, 1];
arr.indexOf(2);      // 1
arr.lastIndexOf(2);  // 3
arr.includes(3);     // true

// find 示例
let users = [{id:1, name:'A'}, {id:2, name:'B'}];
users.find(u =&gt; u.id === 2); // {id:2, name:'B'}
users.findIndex(u =&gt; u.name === 'B'); // 1

迭代与遍历方法(不修改原数组)

这些方法都接收一个回调函数,函数参数通常为 (value, index, array)

方法说明返回值
forEach(callback)对每个元素执行一次回调undefined
map(callback)创建一个新数组,其结果是原数组每个元素调用回调后的返回值新数组
filter(callback)创建一个新数组,包含所有通过测试的元素新数组
reduce(callback, initialValue)对数组元素累积计算,从左到右累积结果
reduceRight(callback, initialValue)与 reduce 类似,但从右向左累积结果
some(callback)测试是否有元素通过测试boolean
every(callback)测试是否所有元素都通过测试boolean
let arr = [1, 2, 3, 4];
arr.forEach(v =&gt; console.log(v * 2));          // 输出2,4,6,8
let doubled = arr.map(v =&gt; v * 2);             // [2,4,6,8]
let evens = arr.filter(v =&gt; v % 2 === 0);      // [2,4]
let sum = arr.reduce((acc, cur) =&gt; acc + cur, 0); // 10
let hasEven = arr.some(v =&gt; v % 2 === 0);      // true
let allPositive = arr.every(v =&gt; v &gt; 0);       // true

排序、反转与填充

方法说明是否修改原数组
sort(compareFn)对数组元素进行排序(默认按字符串排序)✅ 是
reverse()反转数组元素顺序✅ 是
fill(value, start, end)用固定值填充数组部分或全部元素✅ 是
let arr = [3, 1, 4, 2];
arr.sort();                 // [1,2,3,4] (字符串排序)
arr.sort((a,b) =&gt; a - b);   // 升序 [1,2,3,4]
arr.sort((a,b) =&gt; b - a);   // 降序 [4,3,2,1]

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

let filled = [1,2,3,4];
filled.fill(0, 1, 3);       // [1,0,0,4]

数组拼接、截取与扁平化

方法说明返回值是否修改原数组
concat(arr1, arr2, ...)合并两个或多个数组新数组❌ 否
slice(start, end)截取数组的一部分新数组❌ 否
flat(depth)按照指定深度递归扁平化数组新数组❌ 否
flatMap(callback)先 map 再 flat(1)新数组❌ 否
let arr1 = [1,2];
let arr2 = [3,4];
arr1.concat(arr2);        // [1,2,3,4]

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

let nested = [1, [2, [3, [4]]]];
nested.flat(2);           // [1,2,3,[4]]

let words = ["hello", "world"];
words.flatMap(w =&gt; w.split('')); // ['h','e','l','l','o','w','o','r','l','d']

转换为字符串

方法说明示例
join(separator)将数组元素用指定分隔符连接成字符串[1,2,3].join('-') → "1-2-3"
toString()将数组转换为逗号分隔的字符串[1,2,3].toString() → "1,2,3"
toLocaleString()返回本地化字符串(常用于日期、数字)[new Date()].toLocaleString()

其他有用方法

方法说明
keys()返回一个包含数组索引的可迭代对象
values()返回一个包含数组值的可迭代对象
entries()返回一个包含 [index, value] 的可迭代对象
copyWithin(target, start, end)在数组内部复制一段元素(会修改原数组)
with(index, value)(ES2023) 返回一个新数组,将指定索引的元素替换为新值(不修改原数组)
toSorted()(ES2023) 返回一个新排序数组(不修改原数组)
toReversed()(ES2023) 返回一个新反转数组(不修改原数组)
// 复制自身内部片段
let arr = [1,2,3,4,5];
arr.copyWithin(0, 3, 5);  // [4,5,3,4,5]

// 不修改原数组的方式 (ES2023+)
let original = [3,1,2];
let sortedCopy = original.toSorted();    // [1,2,3]
let reversedCopy = original.toReversed();// [2,1,3]
let replacedCopy = original.with(1, 99); // [3,99,2]
// original 仍然是 [3,1,2]

常用技巧总结表(按场景速查)

场景推荐方法
遍历并执行操作forEach
映射转换map
过滤筛选filter
累积计算reduce / reduceRight
查找元素find
查找索引indexOf / findIndex
判断存在includes / some
验证全部every
尾部增删push / pop
头部增删unshift / shift
任意位置增删splice
合并数组concat / 扩展运算符 [...arr1, ...arr2]
截取子数组slice
扁平化flat / flatMap
深拷贝简单数组slice() 或 [...arr]
去重(简单类型)Set + Array.from
数组求并集/交集/差集配合 Set 和 filter

注意事项

掌握这些方法,你可以写出更简洁、更高效的数组操作代码。建议结合实际业务场景多练习,逐步内化这些 API。

到此这篇关于一文分享15个JavaScript中常用的数组操作方法的文章就介绍到这了,更多相关JavaScript数组操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文