Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript的数组常规操作

JavaScript的数组常规操作

作者头像
青梅煮码
发布于 2023-01-31 02:24:08
发布于 2023-01-31 02:24:08
1.6K00
代码可运行
举报
文章被收录于专栏:青梅煮码青梅煮码
运行总次数:0
代码可运行

JavaScript的数组操作

JavaScript数组也是对象,它使用单一的变量存储一系列的值。

数组和对象的区别

在JavaScript中,数组必须使用数字索引,对象可以使用命名索引。 数组是特殊类型的对象,具有特有的一些属性和方法。

如何区分数组和对象

方案1 ECMAScript5定义新方法Array.isArray()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [];
var obj = {};
console.log(Array.isArray(arr));
// true
console.log(Array.isArray(obj));
// false

此方案不支持老的浏览器。

方案2

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [];
console.log(Object.prototype.toString.call(arr));
// [object Array]
var obj = {};
console.log(Object.prototype.toString.call(obj));
// [object Object]

创建

使用字面量创建

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [];

使用构造函数创建

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = new Array();
console.log(arr);
// []
arr = new Array(2);
console.log(arr);
// [empty × 2],当构造函数只传一个参数时如2,生成一个长度为2,都为空位的数组
arr = new Array(1, 2);
console.log(arr);
// [1, 2]

出于简洁、可读性和执行速度的考虑,建议使用第一种方法。

取值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
console.log(arr[1]);// 2

修改值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
arr[1] = 3;
console.log(arr);
// [1, 3]

超过数组长度赋值、取值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
arr[3] = 3;
console.log(arr);
// [1, 2, empty, 3]
console.log(arr[4]);
// undefined

删除元素

数组属于对象,所以可以使用delete运算符执行删除操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [0];
console.log(arr);
// [0]
delete arr[0];
console.log(arr);
// [empty]

元素长度length

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
console.log(arr.length);
// 2

for循环遍历

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
for (var i = 0, len = arr.length; i < len; i ++) {
 console.log(arr[i]);
}
// 1
// 2

for…in循环遍历

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
for (index in arr) {
 console.log(arr[index]);
}
// 1
// 2

concat()-合并两个或多个数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr1 = [1];
var arr2 = [2];
console.log(arr1.concat(arr2));
// [1, 2]
var arr = [1];
console.log(arr.concat(2, 3));
// [1, 2, 3]

不会改变原数组

join()-将数组元素拼接成一个字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
console.log(arr.join('-'));
// 1-2

不会改变原数组

sort()-排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
console.log(arr.sort());
// [1, 2]
console.log(arr.sort((item1, item2) => {
 return item1 - item2;
}));
// [1, 2]
console.log(arr.sort((item1, item2) => {
 return item2 - item1;
}));
// [2, 1]
console.log(arr);
// [2, 1]

返回对数组的引用,在原数组上进行排序,不生成副本。 说明

  1. 函数中比较如果小于零,则排序结果item1在前,item2在后。即return item1 – item2为升序,反之return item2 – item1为降序。所以return 0.5 – Math.random()可以实现随机排序。
  2. sort也可以对文字排序,和数字排序一样,遵从ASCII编码的排序规则

查找最值

方案一 查找最小值(最大值同理)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
console.log(arr.sort(function (a, b) {
 return a - b;
})[0]);

需要对数组进行排序,效率较低 方案二

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
function getArrMax(arr) {
 return Math.max.apply(null, arr);
}
function getArrMin(arr) {
 return Math.min.apply(null, arr);
}
console.log(getArrMax(arr));
// 2
console.log(getArrMin(arr));
// 1

pop()-删除并返回数组的最后一个元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
console.log(arr.pop());
// 2
console.log(arr);
// [1]

会改变原数组

push()-向数组的末尾添加一个或多个元素,并返回新的长度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
console.log(arr.push(3));
// 3
console.log(arr);
// [1, 2, 3]

会改变原数组 push()方法和pop()方法使用数组提供的先进后出栈的功能。

reverse()-颠倒数组中元素的顺序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
console.log(arr.reverse());
// [2, 1]

会改变原数组

shift()-删除数组第一个元素,并返回第一个元素的值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
console.log(arr.shift());
// 1
console.log(arr);

会改变原数组

unshift()-向数组的开头添加一个或更多元素,并返回新的长度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1];
console.log(arr.unshift(3));
// 2
console.log(arr);
// [3, 1]

改变原有的数组

slice()-返回选定的元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
arrayObject.slice(start,end)

start、end都可以使用负值从数组的尾部选取元素,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2, 3];
console.log(arr.slice(1, 2));
// [2]
console.log(arr);
// [1, 2, 3]

不会改变原数组,如果需要删除数组中的一段元素,应该使用方法Array.splice()

splice()-从数组中添加/删除元素,返回被删除元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
arrayObject.splice(index,howmany,item1,.....,itemX)

howmany如果设置为0,则不会删除项目。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2, 3, 4, 5];
console.log(arr.splice(2, 1, 6));
// [3]
console.log(arr);

改变原始数组。

toString()-将数组转换为字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2, 3];
console.log(arr.toString());
// 1,2,3

返回值与没有参数的join()方法返回的字符串相同,元素之间用逗号分隔

toLocaleString()-把数组转换为本地字符串

首先调用每个数组元素的toLocaleString()方法,然后使用地区特定的分隔符把生成的字符串连接起来,形成一个字符串。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = ['a', 'b', 'c'];
console.log(arr.toLocaleString());
// a,b,c

valueOf()-返回Array对象的原始值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
console.log(arr.valueOf());
// [1, 2]

通常由JavaScript在后台自动调用,并不显式地出现在代码中。

forEach()-为每个元素调用一次函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
arr.forEach(function (item, index, arr) {
 console.log(item);
 console.log(index);
 console.log(arr);
});
// 1
// 0
// [1, 2]
// 2
// 1
// [1, 2]

不改变原数组

map()-对每个元素执行函数来创建新数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
console.log(arr.map(function (item, index, array) {
 return item * 2;
}));
// [2, 4]
console.log(arr);
// [1, 2]

不改变原数组

filter()-通过测试的元素创建新数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2];
console.log(arr.filter(function (item, index, array) {
 return item > 1;
}));
// [2]
console.log(arr);

不改变原数组

reduce()-每个元素运行函数,以生成(减少它)单个值。从左到右工作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2, 3];
var sum = arr.reduce(function (total, value, index, array) {
 return total + value;
});
console.log(sum);
// 6
console.log(arr);

可以接受一个初始值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2, 3];
var sum = arr.reduce(function (total, value, index, array) {
 return total + value;
}, 4);
console.log(sum);
// 10
console.log(arr);
// [1, 2, 3]

reduceRight()-每个元素运行函数,以生成(减少它)单个值。从右到左工作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2, 3];
var sum = arr.reduceRight(function (total, value, index, array) {
 return total + value;
}, 4);
console.log(sum);
// 10
console.log(arr);
// [1, 2, 3]

every()-检查所有数组值是否通过测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2, 3];
console.log(arr.every(function (value, index, array) {
 return value < 3;
}));
// false

some()-检查某些数组值是否通过测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2, 3];
console.log(arr.some(function (value, index, array) {
 return value < 3;
}));
// true

indexOf()-搜索元素值并返回其位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array.indexOf(item, start)

item 必需。要检索的项目。 start 可选。从哪里开始搜索。负值将从结尾开始的给定位置开始,并搜索到结尾。

未找到项目返回-1。 项目多次出现,返回第一次出现的位置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2, 3];
console.log(arr.indexOf(2));
// 1

lastIndexOf()-搜索元素值并返回其位置,从结尾开始搜索

代码语言:javascript
代码运行次数:0
运行
复制

item 必需。要检索的项目。 start 可选。从哪里开始搜索。负值将从结尾开始的给定位置开始,并搜索到开头。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2, 3];
console.log(arr.lastIndexOf(2));
// 1

find()-返回通过测试函数的第一个元素的值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2, 3];
console.log(arr.find(function (value, index, array) {
 return value > 1;
}));
// 2

findIndex()-返回通过测试函数的第一个元素的索引

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2, 3];
console.log(arr.findIndex(function (value, index, array) {
 return value > 1;
}));
// 1

es6中的数组操作

Array.from()-将类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map)转为真正的数组

所谓类似数组的对象,本质特征只有一点,即必须有length属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arrLike = {
 "0": 1,
 "1": 2,
 length: 2,
};
// ES5的写法
console.log([].slice.call(arrLike));
// [1, 2]
// ES6的写法
console.log(Array.from(arrLike));
// [1, 2]

只要部署了Iterator接口的数据结构,Array.from都能将其转为数组,如Set和Map。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var set = new Set([1, 2])
console.log(Array.from(set));
// [1, 2]

Array.from还可以接受第二个参数,作用类似于数组的map方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arrLike = {
 "0": 1,
 "1": 2,
 length: 2,
};
console.log(Array.from(arrLike, value => value *2));
// [2, 4]

如果map函数里面用到了this关键字,还可以传入Array.from的第三个参数,用来绑定this。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arrLike = {
 "0": 1,
 "1": 2,
 length: 2,
};
var context = {
 key: 1,
}
console.log(Array.from(arrLike, function () { return this.key *2 }, context));
// [2, 2]

Array.of()-将一组值转换为数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log(Array.of(1, 2));
// [1, 2]
console.log(Array.of(2));
// [2]

参数个数不同,不会有像new Array()一样行为有差异。

Array.of()的模拟实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function ArrayOf(){
 return [].slice.call(arguments);
}

Array.prototype.copyWithin()-在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组。

代码语言:javascript
代码运行次数:0
运行
复制
  1. target(必需):从该位置开始替换数据。如果为负值,表示倒数。
  2. start(可选):从该位置开始读取数据,默认为 0。如果为负值,表示从末尾开始计算。
  3. end(可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示从末尾开始计算。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var arr = [1, 2, 3, 4, 5];
console.log(arr.copyWithin(0, 3));
// [4, 5, 3, 4, 5]
console.log(arr);
// [4, 5, 3, 4, 5]

Array.prototype.fill()-使用给定值,填充一个数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
arr.fill(value, start, end);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log([1, 2, 3].fill(4, 1, 2));
// [1, 4, 3]

Array.prototype的entries()、keys()和values()

keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (let index of [1, 2].keys()) {
 console.log(index);
}
// 0
// 1

for (let value of [1, 2].values()) {
 console.log(value);
}
// 1
// 2

for (let [index, value] of [1, 2].entries()) {
 console.log(index, value);
}
// 0 1
// 1 2

Array.prototype.includes()-表示数组是否包含给定的值,与字符串的includes方法类似。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Array.prototype.includes(value, start);

该方法的第二个参数表示搜索的起始位置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log([1, 2, 3].includes(3, 3));
// false
console.log([1, 2, 3].includes(3, -1));
// true

includes不会导致对NaN的误判

Array.prototype.flat()-将嵌套的数组“拉平”

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log([1, 2, [3, 4]].flat());
// [1, 2, 3, 4]
console.log([1, 2, [3, [4, 5]]].flat(1));
// [1, 2, 3, Array(2)]
console.log([1, 2, [3, [4, 5]]].flat(2));
// [1, 2, 3, 4, 5]

flat()的参数代表“拉平”几层的嵌套数组,使用Infinity关键字,不管多少层嵌套,都可以转成一维数组。

Array.prototype.flatMap()-对原数组的每个成员执行一个函数,对返回值组成的数组执行flat()方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
arr.flatMap(function callback(currentValue, index, array) {
 // ...
}, thisArg)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log([2, 3, 4].flatMap((x) => [x, x * 2]));
// [2, 4, 3, 6, 4, 8]

只能展开一层数组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log([1, 2, 3, 4].flatMap(x => [[x * 2]]));
// [[2], [4], [6], [8]]
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JavaScript 数组操作方法大全
数组操作是 JavaScript 中非常重要也非常常用的技巧。本文整理了常用的数组操作方法(包括 ES6 的 map、forEach、every、some、filter、find、from、of 等),熟悉了这些数组操作方法,编写程序也会更加简洁高效。
写bug的高哈哈
2024/11/05
611
JavaScript 数组操作方法大全
28个Javascript数组方法,开发者的小抄
最近面试有道题是至少写出 15 个数组方法,数组方法平时经常用到的也就6-7个,突然要一下子写出15个,还是有点卡壳了,今天整理一波,日后好复习。
前端小智@大迁世界
2022/05/09
3290
ES6入门之数组的扩展
在实际中,像获取dom后返回的Nodelist集合,以及函数内部的arguments对象就是类数组,通过 Array.from将它们转换为真正的数组。
执行上下文
2022/07/26
2090
ES6入门之数组的扩展
ES6数组新增
该方法可以将类数组对象或可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)转换为数组对象,类数组即:可以通过索引访问元素,并且拥有 length 属性;
_kyle
2020/08/24
6810
数组常用方法含ES6新增
forEach 加不加return 都返回undefined var arr = [1,2,6,4,3,0] var arr1 = arr.map(function(item){ if(item>4){ return item; } }) arr1 : [undefined, undefined, 6, undefined, undefined, undefined]
一只眠羊
2021/03/30
6260
ES6中数组做了哪些新扩展?
ES6通过扩展元素符...,好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列
用户6256742
2024/07/15
950
ES6中数组新增扩展盘点
ES6通过扩展元素符...,好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列
@超人
2021/07/05
5680
ES6中数组新增扩展盘点
ES6之数组的扩展
copyWithin方法:改变原数组,接收三个参数,在当前数组内部,将指定位置的成员复制到其他位置(数组函数参数的下标都是包前不包后)
wade
2020/04/24
4020
Js数组操作
JavaScript数组操作,主要包括Array对象原型方法以及常用操作如去重、扁平化、排序等。
WindRunnerMax
2020/08/27
17.1K0
9102年了,Array数组的方法赶紧用起来!
写久了业务代码的我,已经要被社会抛弃了。今天回过头去巩固基础知识,发现有很多自己业务中不经常用,或者说是不知道那个方法,导致自己重写一个方法去实现。关于Array对象的方法你是否只用concat、join、pop、push、shift、unshift、reverse、sort、slice、splice、toString、indexOf、find等?接下来我们就一起回顾一下那些我们用的少或者没有用过的Array对象方法!
拾贰
2019/08/28
4230
9102年了,Array数组的方法赶紧用起来!
ES6学习笔记(二)
设有默认值的参数,必须放在最后一个参数的位置,如:func(x,y,z = 5);
CherishTheYouth
2019/07/30
5630
常见的数组基本用法
ES5方法:pop push shift unshift reverse sort splice
前端迷
2021/04/09
9430
JavaScript常用数组操作方法,包含ES6方法
concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,仅会返回被连接数组的一个副本。
李才哥
2019/07/10
4560
Javascript数组操作
使用JS也算有段时日,然对于数组的使用,总局限于很初级水平,且每每使用总要查下API,或者写个小Demo测试下才算放心,一来二去,浪费不少时间;思虑下,堪能如此继续之?当狠心深学下方是正道。 一, 数组常用方法 1. 数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长度 var arrayObj = new Array([element0[, element1
晚晴幽草轩轩主
2018/03/27
4K0
JavaScript中数组的操作方法(含ES6)
push() 方法可向数组的末尾添加一个或多个元素,并返回新的数组长度。会改变原数组。
Caleb
2020/11/03
5920
通过事例重温一下常见的 JS 中 15 种数组操作(备忘清单)
数组是 JS 中广泛使用的数据结构。数组对象提供了大量有用的方法,如array. forEach()、array.map()等来操作数组。
前端达人
2019/12/24
1.2K0
ES6数组新方法[通俗易懂]
forEach()会修改原来的数组,不会返回执行结果。map()方法会得到一个新的数组并返回。 map的执行速度会更快。
全栈程序员站长
2022/09/05
4490
【收藏】JavaScript数组方法速查手册极简版
JavaScript数组方法速查手册极简版中共收了32个数组的常用方法和属性,并根据方法的用途进行重新排序和分类,在文中简要的介绍了方法作用和用例说明。收藏备用吧!
毛瑞
2019/04/30
5120
【收藏】JavaScript数组方法速查手册极简版
22个超详细的 JS 数组方法
https://juejin.cn/post/6907109642917117965
前端达人
2021/01/27
3.6K0
Javascript数组方法(ES5-ES6)
join(speparator):将数组的元素组起一个字符串,spearator为分隔符,省略的话则用默认用逗号为分隔符,该方法只接收一个参数,即分隔符。
用户9298250
2021/12/29
1.1K0
相关推荐
JavaScript 数组操作方法大全
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验