【Javascript】Array 数组对象
一、数组介绍
- 数组是一种复合数据类型
- 在数组可以存储多个不同类型的数据,任何类型的值都可以成为数组中的元素
- 创建数组时尽量要确保数组中存储的数据的类型是相同的
- 数组中存储的是有序的数据
- 数组中的每个数据都有一个唯一的索引
- 可以通过索引来操作获取数据
- 数组中存储的数据叫做元素
- 索引(index)是一组大于0的整数
二、创建数组
1. 构造函数方式创建数组
const arr = new Array(arg0,arg1....) //实例化数组的同时传递参数
const arr1 = new Array(10) //创建一个长度为10的空数组
2. 字面量的方式创建数组
const arr = []
3. 方法的方式创建数组
Array.of(elementN)
通过可变数量的参数创建一个新的 Array 实例,而不考虑参数的数量或类型。- 参数
elementN
用于创建数组的元素
- 返回值
- 新的Array实例
arr = Array(7) // [,,,,,,]
arr1 = Array.of(7) // [7]
```
- 参数
三、读取/修改数组
- 如果读取了一个不存在的元素,会返回undefined
arr[index]
- 根据索引值获取数组中对应元素内容
1. 遍历数组的方式
1.1 for
循环
const arr = [1,2,3,4,5]
for (let i = 0 ; i < arr.length ; i++){
console.log(arr[i]); //1,2,3,4,5
}
1.2 for-of
const arr = [1,2,3,4,5]
for ( let i of arr){
console.log(i); //1,2,3,4,5
}
1.3 for-in(数组不推荐)
for-in
用来遍历数组的下标和对象的键const arr = [1,2,3,4,5]
for ( let i in arr){
console.log(arr[i]); //1,2,3,4,5
}
1.4 forEach()
const arr = [1,2,3,4,5]
arr.forEach(i=>{console.log(i);}) // 1,2,3,4,5
1.5 map()
const arr = [1,2,3,4,5]
const arr1 = arr.map(item=>item) //[1,2,3,4,5]
```
1.6 filter()
const arr = [1,2,3,4,5]
const arr1 = arr.filter(item=>item) //[1,2,3,4,5]
2. 数组去重
2.1 对比索引值
- 当前元素的索引值与第一次出现的索引值不同则说明不是第一次出现
const arr = [1,2,3,1,2,3,1,2,3,1,2,3]
const arr1 = arr.filter((item,index) => arr.indexOf(item)==index)
arr1 // [123]
2.2 数组中不存在则添加进数组
- 创建一个空数组,遍历时将元素添加进数组
- 如果数组中存在当前值,则跳过当前值
// 用forEach实现
const arr = [1,2,3,4,5,1,2,3,1,2,2,1]
let arr1 = []
arr.forEach(item =>{
if (arr1.indexOf(item) == -1){
arr1.push(item)
}
})
console.log(arr1); // 用reduce实现
const arr2 = [1,2,3,1,2,3,1,2,3]
const arr3 = arr.reduce((pre,cur)=>{
if(!pre.includes(cur)){
pre.push(cur)
}
return pre
},[])
四、方法
1. 非破坏性方法(对原数组没有影响)
array.indexOf(str,index)
获取元素在数组中第一次出现的位置const arr = [1,2,3,4,5]
console.log(arr.indexOf(3)); // 2 const arr1 = [1,2,3,1,2,3,1,2,3]
console.log(arr1.indexOf(3)); // 2
console.log(arr1.indexOf(3,3)); // 5
array.lastIndexOf(str,index)
获取元素在数组中最后一次出现的位置没有找到返回-1const arr = [1,2,3,4,5]
console.log(arr.lastIndexOf(3)); // 2 const arr1 = [1,2,3,1,2,3,1,2,3]
console.log(arr1.lastIndexOf(3)); // 8
console.log(arr1.lastIndexOf(3,-3)); // 5
array.length
获取数组的长度,获取的实际值是数组的最大索引+1- 可以作为索引用来向数组最后添加元素
- length是可以修改的,数组的长度会变为指定的长度
- 如果修改后的长度比原来长,就会在数组后面添加空属性
- 如果修改后的长度比原来短,就会从右向左删除
const arr = [1, 2, 3, 4, 5] console.log(arr.length); //5 arr[arr.length] = 6
console.log(arr); // [ 1, 2, 3, 4, 5, 6 ]
console.log(arr.length); // 6 arr.length = 4
console.log(arr); // [ 1, 2, 3, 4 ] arr.length = 10
console.log(arr); // [ 1, 2, 3, 4, , , , , , ]
array.forEach(callback,[thisArg]) --ES5
列出数组的每个元素- 参数
callback
定义一个函数接收方法传入的值并进行运算value
必须 定义一个变量接收数组元素[index]
定义一个变量接收当前元素的索引值[array]
定义一个变量接收当前元素所在的数组
[this]
传入一个HTML元素,当前函数的this会指向这个元素
const arr = [1,2,3,{name:'张三'}]
arr.forEach(item =>{console.log(item)}) //1,2,3,{name:'张三'}
- 参数
array.map(callback,[thisArg]) --ES5
返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。- 参数
callback
定义一个函数接收方法传入的值并进行运算value
定义一个变量接收数组元素[index]
定义一个变量接收当前元素的索引值[array]
定义一个变量接收当前元素所在的数组
[thisArg]
传入一个HTML元素,当前函数的this会指向这个元素
const arr = [1,2,3,4]
const arr1 = arr.map(item=>{
return 2*item
})
arr1 // [2,4,6,8]
- 参数
array.filter(callback,[thisArg]) --ES5
过滤出数组中满足条件的值并返回 参数与forEach相同- 参数
callback
定义一个函数接收方法传入的值并进行运算value
定义一个变量接收数组元素[index]
定义一个变量接收当前元素的索引值[array]
定义一个变量接收当前元素所在的数组
[thisArg]
传入一个HTML元素,当前函数的this会指向这个元素
- 返回值
- 如果返回值为不为false,则返回数组当前元素,否则返回空
// 过滤出>= 60的数字
const arr = [30, 40, 50, 60, 70, 80, 90, 100]
const arr1 = arr.filter(item => item >= 60)
arr1 // [60,70,80,90,100]
- 参数
array.reduce(callback,Initialization) --ES5
将数组的内容按照函数处理并回调,最后返回汇总计算结果- 参数
callback
previousValue
- 第一轮 : 如果
Initialization
未定义,该值为array[0]
的值 - 后续: 上一次的返回值
- 第一轮 : 如果
currentValue
- 当前正在处理的元素
currentIndex
- 当前元素的索引
array
- 用于遍历的数组
Initialization
- 将参数
callback
中的previousValue
首轮定义为该值 - 若该参数为空,则取
array[0]
- 将参数
let arr = [1, 2, 3, 4, 5]
arr1 = arr.reduce(
// 参数一回调函数
(previousValue, currentValue,currentIndex,array) => {
// previousValue为上一轮函数返回值
// 因为arr[0] == 1,且reduce未定义第二个参数 所以previousValue从1即arr[0]开始
console.log(previousValue);
// currentValue为从arr[1]开始的遍历元素,如果参数二定义,则从arr[0]开始
console.log(currentValue);
// index为当前元素的下标
console.log(currentIndex);
// array为当前元素所在的数组
console.log(array);
// 返回值传入下一轮函数作为previousValue使用
return previousValue + currentValue
// 函数整体流程
// 第四轮{第三轮(第二轮[第一轮(1 + 2)+3]+4}+5= 15
}
// 参数二未定义,如果定义参数二,则参数二为第一轮previousValue,即代替第一轮的arr[0]进行运算 )
arr1
arr
- 参数
array.at(index) --ES5
根据索引值获取数组中的对应值const arr = [1, 2, 3, 4, 5]
console.log(arr.at(1)); // 2
array.concat(array2) --Es5
用来连接两个或多个数组,重复的内容不会覆盖const arr = [1, 2,3, {name:'张三'}]
const arr1 = [{name:'张三'},6,7]
const arr2 = arr.concat(arr1)
console.log(arr2); //[ 1, 2, 3, { name: '张三' }, { name: '张三' }, 6, 7 ]
array.join(连接符) --ES5
将一个数组的元素链接为一个字符串,指定一个字符串作为连接符,默认为逗号- 返回值
- 链接后的字符串
const arr = ['张三','李四','王五'] console.log(arr.join()); //张三,李四,王五
console.log(arr.join('---')); //张三---李四---王五
- 返回值
array.slice(起始位置,结束位置) --ES5
用来截取数组并返回- 第二个参数可以省略不写,如果省略不写,会一直截取到最后
- 如果两个参数全部省略,则赋值时会对数组进行浅拷贝(浅复制)
const arr = ['张三','李四','王五'] console.log(arr.slice(1)); // [ '李四', '王五' ]
console.log(arr.slice(0,2)); //[ '张三', '李四']
console.log(arr.slice()); //[ '张三', '李四', '王五' ]
every --ES5
用于检测数组所有元素是否都符合指定条件- 参数
callback
回调函数 用来测试每个元素的函数,可以接受三个参数element
数组中正在处理的元素[index]
当前元素的索引值[array]
被调用的数组
[thisArg]
执行callback
时函数的this
指向该对象
- 返回值
- 数组中至少有一个元素不通过
callback
函数的测试就会返回false
,当所有元素都通过则返回true
const arr = [1,2,3,4,5]
arr.every(item=>item>1) //false
arr.every(item=>item>0) //true
- 数组中至少有一个元素不通过
- 参数
array.some(callback,thisArg) --ES5
用于检测数组中的元素是否至少有一个满足指定条件- 参数
callback
回调函数 用来测试每个元素的函数,可以接受三个参数element
数组中正在处理的元素[index]
当前元素的索引值[array]
被调用的数组
[thisArg]
执行callback
时函数的this
指向该对象
- 返回值
- 数组中至少有一个元素通过
callback
函数的测试就会返回true,当所有元素都没有通过则返回false
arr = [1,2,3,4,5]
arr.some(item => item > 0 ) //true
arr.some(item => item < 0 ) //false
- 数组中至少有一个元素通过
- 参数
array.toString() --ES5
用于将数组内容转换为字符串arr = [1,2,3,4,5]
str = arr.toString() // "1,2,3,4,5"
arrary.includes(searchElement,fromIndex) --ES6
用来判断一个数组是否包含一个指定的值searchElement
需要查找的元素值[fromIndex]
开始查找的索引值,可以为负数
Array.isArray(Value) --ES6
判断是否为数组类型,并返回布尔值const arr = [1, 2, 3, 4, 5]
const x = 1
console.log(Array.isArray(arr)); // true
console.log(Array.isArray(x)); // false
Array.from(arrayLike,mapFn,thisArg) --ES6
对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。- 参数
arrayLike
想要转换成数组的对象或可迭代对象(例如获取到的元素列表)[mapFn]
如果指定了该参数,则新数组中的每个元素都会执行该回调函数[thisArg]
执行回调函数时,函数内的this
会指向该对象
- 返回值
- 如果未指定
mapFn
参数,则返回arrayLike
转换后的数组 - 如果指定了
mapFn
参数,则返回该函数的返回值
- 如果未指定
- 参数
array.find(callbackfn,[thisArg]) --ES6
返回数组中满足提供的测试函数的第一个元素的值,否则返回undefined- 参数
callback
回调函数 用来测试每个元素的函数,可以接受三个参数element
数组中正在处理的元素[index]
当前元素的索引值[array]
被调用的数组
[thisArg]
执行callback
时函数的this
指向该对象
- 返回值
- 如果数组中没有满足条件的元素,则返回undefined
arr = [1,2,3,4,5]
let n1 = arr.find((item,index,arr)=>{
item //1,2,3
index //0,1,2
arr //[1,2,3,4,5] [1,2,3,4,5] [1,2,3,4,5]
return item > 2 // false false true
})
n1 // 3
- 参数
array.findIndex(callbackfn,[thisArg]) --ES6
返回数组中满足提供的测试函数的第一个元素的索引,否则返回-1- 参数
callback
回调函数 用来测试每个元素的函数,可以接受三个参数element
数组中正在处理的元素[index]
当前元素的索引值[array]
被调用的数组
[thisArg]
执行callback
时函数的this
指向该对象
- 返回值
- 如果数组中没有满足条件的元素,则返回-1
arr = [1,2,3,4,5]
let n1 = arr.findIndex((item,index,arr)=>{
item // 1,2,3
index // 0,1,2
arr // [1,2,3,4,5] [1,2,3,4,5] [1,2,3,4,5]
return item > 2 // false false true
})
n1 // 2
- 参数
array.flat() --ES6
用于拉平嵌套组对象let list = [1, 2, 3, [4, [5]]]; let res = list.flat(Infinity)
console.log(res) // [1, 2, 3, 4, 5]
2.破坏性方法(会改变原有数组)
push() --ES5
向数组的末尾添加一个或多个元素,并返回新数组长度const arr = ['张三','李四','王五']
const arr1 = arr.push('小明','小刘') // 5
// 此时arr1 = ['张三','李四','王五','小明','小刘']
pop() --ES5
删除并返回数组的最后一个元素const arr = ['张三','李四','王五']
const arr1 = arr.pop() // '王五'
console.log(arr1) // ['张三','李四']
shift() --ES5
删除并返回数组的第一个元素const arr = ['张三','李四','王五']
const arr1 = arr.shift()
console.log(arr1); // 张三
console.log(arr); // [ '李四', '王五' ]
unshift() --ES5
删除并返回新数组的长度const arr = ['张三','李四','王五']
const arr1 = arr.unshift('小明')
console.log(arr1); // 4
console.log(arr); // [ '小明', '张三', '李四', '王五' ]
splice(startIndex,deleteCount,item1,item2......) --ES5
可以删除、添加、插入、替换数组中的元素- 参数:
startIndex
删除的起始位置deleteCount
删除的数量item1,item2..
插入的元素,可以是无数个,也可以是任意类型
- 返回值:
- 被删除的元素,如果没有删除元素则返回空数组
const arr = [1,2,3]
console.log(arr.splice(0,2,4)); // [1,2]
console.log(arr); // [4,3]
- 参数:
reverse() --ES5
反转数组返回值:反转后的数组
const arr = [1,2,3,4,5]
console.log(arr.reverse()); // [1,2,3,4,5]
sort() --ES5
数组排序- 参数
function(x,y)
比较函数,用来指定排列规则,如果为空,则按照字符串各字符的Unicode位点进行排序x
第一个用于比较的元素。y
第二个用于比较的元素。- 如果函数结果大于0 ,则y在前
- 如果函数结果小于0 ,则x在前
- 如果函数结果等于0 ,则顺序不变
let arr = [10,1,20,2] // 无函数
arr.sort() // [1,10,2,20] function sor(x,y){return x-y}
// 调用比较函数
arr.sort(sor) // [1 , 2 , 10 , 20 ] // 内嵌函数
arr.sort((x,y)=>x-y) // [ 1 , 2 , 10 , 20]
- 参数
array.fill() --ES6
用于填充数组对象let list = [1, 2, 3]; let res = list.fill(1)
console.log(res) // [1, 1, 1]
【Javascript】Array 数组对象的更多相关文章
- javascript之数组对象与数组常用方法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- for 循环 和 Array 数组对象
博客地址:https://ainyi.com/12 for 循环 和 Array 数组对象方法 for for-in for-of forEach效率比较 - 四种循环,遍历长度为 1000000 的 ...
- Javascript进阶篇——( JavaScript内置对象---下)--Array数组对象---笔记整理
Array 数组对象数组对象是一个对象的集合,里边的对象可以是不同类型的.数组的每一个成员对象都有一个“下标”,用来表示它在数组中的位置,是从零开始的数组定义的方法: 1. 定义了一个空数组: var ...
- JavaScript 常用内置对象(字符串属性、Math对象、Array数组对象)
1.字符串属性 <script> var test_var = "I Iove you"; console.log(test_var.charAt(3)) // ...
- JavaScript Array 数组方法汇总
JavaScript Array 数组方法汇总 1. arr.push() 从后面添加元素,返回值为添加完后的数组的长度 var arr = [1,2,3,4,5] console.log(arr.p ...
- JS对象 Array 数组对象 数组对象是一个对象的集合,里边的对象可以是不同类型的。数组的每一个成员对象都有一个“下标”,用来表示它在数组中的位置,是从零开始的
Array 数组对象 数组对象是一个对象的集合,里边的对象可以是不同类型的.数组的每一个成员对象都有一个"下标",用来表示它在数组中的位置,是从零开始的 数组定义的方法: 1. 定 ...
- JavaScript中Array(数组) 对象
JavaScript中Array 对象 JavaScript中创建数组有两种方式 (一)使用直接量表示法: var arr4 = []; //创建一个空数组var arr5 = [20]; // 创建 ...
- JavaScript Array数组方法详解
Array类型是ECMAScript中最常用的引用类型.ECMAScript中的数据与其它大多数语言中的数组有着相当大的区别.虽然ECMAScript中的数据与其它语言中的数组一样都是数据的有序列表, ...
- Java Script基础(八) Array数组对象
一.Array数组 JavaScript中的数组也是具有相同数据类型的一个或者多个值得集合.用法和Java中的数组类似. Array对象的常用属性和方法: 属性: length:获取数组的长度: 方法 ...
- JavaScript类数组对象参考
JavaScript和DOM中有很多类数组对象,它们有以下特点 1.有length属性 2.可以使用[]通过下标访问 3.部分类数组对象使用[]访问成员时不只可以使用下标,还可以使用id或name 4 ...
随机推荐
- ideal中热部署JRebal的设置
1.ideal中安装插件: 2.打开网址:https://www.guidgen.com/ 打开链接获取新的GUID码 3.网址和UUID码拼接:http://127.0.0.1:8888/ca3 ...
- c# Visual Studio|There is no editor available for ***,make sure the application for the file type(.vb) is installed问题解决方法
这个问题出现在在使用VS编码当中,电脑意外关机,导致的文件的缺失或者损坏. 使用反编译软件(如:ILSpy)对编译后的 .EXE文件进行反编译,在翻遍的结果中将相关代码拷贝至目标路径下,替换所需文件. ...
- JS中报错处理 try catch finally的使用
JS中标准报错处理通过 try catch finally ,使用格式 try { } catch (err) { } finally { } 代码1: try { console.log('顺序 1 ...
- 从babel编译结果分析class的实现原理
示例: class A { // 属性表达式 prop1 = 1; // get方法 get value() { console.log('Getting the current value!'); ...
- vTaskList() 介绍
vTaskList() 使用注意:使用 vTaskList() 前需使能: make menuconfig -> Component config -> FreeRTOS -> En ...
- MySQL根据经纬度和距离查询最近的数据
[lat]:输入的纬度 [lon]:输入的经度 [distance]:查询距离内的数据,单位m SELECT * FROM ( SELECT id lon, lat, vin, ROUND( 6378 ...
- 【手搓模型】亲手实现 Vision Transformer
前言 博客主页:睡晚不猿序程 首发时间:2023.3.17,首发于博客园 最近更新时间:2023.3.17 本文由 睡晚不猿序程 原创 作者是蒻蒟本蒟,如果文章里有任何错误或者表述不清,请 tt 我, ...
- Java面试——MyBatis
一.MyBatis 与 JDBC 的区别 [1]JDBC 是 Java 提供操作数据库的 API:MyBatis 是一个持久层 ORM 框架,底层是对 JDBC 的封装.[2]使用 JDBC 需要连接 ...
- Windows11快捷键大集合+手动给程序添加快捷键
本文收集了170多个windows11上的快捷键,其中有少部分是windows11新添加的.大部分的win10快捷键也适用于win11.这些快捷键涵盖了系统设置.命令行程序执行.Snap布局切换.对话 ...
- IDA 逆 WDF 驱动时的函数识别插件
快一年没更新了,累,工作累,各种累,想换个工作,突然发现找不到合适的工作了,哎,自己往火坑里跳,怪不得别人. import idautils import idaapi import idc prin ...