数据结构-数组
存储结构
物理结构:一种线性表数据结构,它用一组连续的内存空间来存储一组具有相同类型的数据(js特性:数组可以存储不同类型的值)
优势
- 高效的查询
- 通过索引实现随机存取
弊端
低效的插入与删除:
- 数组执行插入或删除操作时,往往需要进行频繁的元素移动,开销过大
JavaScript中的数组
1.定义数组
// 1. 普通方式
const arr1 = new Array();
// 2. 指定长度
const arr2 = new Array(5);
// 3. 指定内容
const arr3 = new Array("one", "two");
// 4. 使用[]
const arr4 = [1, 2, 3, 4];
2.长度与遍历
// 获取长度
const arr = [1, 2, 3, 4];
let len = arr.length; // 4
/* 遍历 */
// 1. 使用 for
for (let i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
// 2. 使用数组的 foreach(function) 函数
arr.forEach((value) => console.log(value));
// 3. 使用 for...in
// // 注意当给数组添加了属性后,for...in 会把这个这个属性也遍历出来
for(let index in arr){
console.log(arr[index]);
}
// 4. 使用 for...of
for (let value of arr) {
console.log(value);
}
3.插入元素
/* 添加元素 newValue*/
// 1. 添加到任意位置(index)
for (let i = arr.length; i > index; i--) {
arr[i] = arr[i-1];
}
arr[index] = newValue;
// 2. 数组末尾添加元素
arr[arr.length] = newValue;
// 3. 使用数组的 push() 函数在数组末尾添加元素
// 返回新数组的长度
let newLength = arr.push(newValue);
arr.push(newValue1, newValue2, ...);
// 4. 使用数组的 unshift() 函数在数组的开头添加元素
// unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。
let newLength = arr.unshift(newValue1, newValue2, ...);
// 5. 使用 splice() 方法用于添加或删除数组中的元素
let arr6 = [1,2,3,4];
// 第一参数代表 插入位置的索引
// 第二个参数,可以理解为用第二个参数后面的参数来替换其的长度
// 返回被删除的元素数组,如果为添加元素,则返回空数组
let deleteArr = arr6.splice(2, 0, newValue1, newValue2, newValue3);
// [1, 2, newValue1, newValue2, newValue3, 3, 4]
4.删除元素
// 1. 快速清空数组
arr.length = 0;
// 2. 删除末尾元素
// 使用 pop() 删除数组的最后一个元素并返回删除的元素
let lastEle = arr.pop();
// 3. 删除首元素
// 使用 shift() 删除数组的第一个元素,并返回第一个元素的值。
let firstEle= arr.shift();
// 4. 删除任意位置元素
// 4.1 从要删除元素的位置对整个数组进行移位,后一个元素覆盖掉前一个元素的值
// 4.2 使用 splice(start,length) 元素,添加元素模块已经阐述,这里不做说明
5.JS中数组中常用数组方法的总结
会改变原数组的方法
方法名 | 参数 | 功能 | 返回值 |
---|---|---|---|
sort() | (sortfunction) 可选。规定排序顺序。必须是函数(compare)。 | 用于对数组的元素进行升降排序,默认排序顺序为按字母升序,当数字是按字母顺序排列时"40"将排在"5"前面。使用数字排序,必须通过一个函数作为参数来调用。函数指定数字是按照升序还是降序排列。 | 返回排序后的数组 |
reverse() | 无参 | 用于颠倒数组中元素的顺序 | 返回反转后的数组 |
pop() | 无参 | 删除数组的最后一个元素并返回删除的元素 | 返回删除的元素,如果数组为空,返回undefine |
shift() | 无参 | 用于把数组的第一个元素从其中删除,并返回第一个元素的值 | 返回删除的元素,如果数组为空,返回undefine |
push() | (item1, item2, …, itemX) | 向数组的末尾添加一个或多个元素 | 返回新数组的长度 |
unshift() | (item1, item2, …, itemX) | 可向数组的开头添加一个或更多元素,并返回新的长度 | 返回新数组的长度 |
splice() | (index, howmany , item1, …, itemX) howmany -->可选。规定应该删除多少元素。必须是数字,但可以是 “0”。如果未规定此参数,则删除从 index 开始到原数组结尾的所有元素 | 用于添加或删除数组中的元素 | 返回被删除的元素数组,如果为添加元素,则返回空数组 |
fill() | (value, start, end) | 用于将一个固定值替换数组的元素 | 返回一个数组 |
不会改变原数组的方法
(检索时,想检索的元素不存在,返回undefine,如果检索的索引不在,返回-1 )
方法名 | 参数 | 功能 | 返回值 |
---|---|---|---|
concat() | (array2, array3, …, arrayX) | 用于连接两个或多个数组(该参数可以是具体的值,也可以是数组对象。可以是任意多个) | 会返回被连接数组的一个副本 |
every() | (function(currentValue, index, arr), thisValue) 当对象作为该执行回调时使用,thisValue可以传递给函数,用作 “this” 的值 | 用于检测数组所有元素是否都符合指定条件, every() 不会对空数组进行检测 | 所有元素都满足条件,则返回 true,否则返回false |
filter() | (function(currentValue, index, arr), thisValue) | 创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素 | 返回通过过滤的新数组 |
find() | (function(currentValue, index, arr),thisValue) | 返回通过测试(函数内判断)的数组的第一个元素的值 | 有满足函数条件的情况下返回元素,否则返回 undefine |
findIndex() | (function(currentValue, index, arr), thisValue) | 返回传入一个测试条件(函数)符合条件的数组第一个元素位置 | 有满足函数条件的情况下返回元素索引,否则返回 -1 |
includes() | (searchElement, fromIndex) 第二个参数可选(可选。从该索引处开始查找 searchElement。如果为负值,则按升序从 array.length + fromIndex 的索引开始搜索,如果结果小于零,从0开始搜索,如果大于length,不搜索。默认为 0。) | 来判断一个数组是否包含一个指定的值 | 返回 true/false(可判断NaN) |
indexOf() / lastIndexOf() | (item, start) | 数组中某个指定的元素第一次/最后一次出现的位置 | 如果寻找元素存在,返回其索引,否则返回-1 |
map() | (function(currentValue, index, arr), thisValue) | 返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值 | 返回一个原数组等长度的数组 |
some() | (function(currentValue, index, arr), thisValue) | 用于检测数组中的元素是否满足指定条件(函数提供) | 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测,否则返回false |
join() | (separator) 可选。指定要使用的分隔符。如果省略该参数,则使用逗号作为分隔符 | 用于把数组中的所有元素转换成一个通过指定的分隔符进行分隔的字符串 | 字符串 |
reduce() | (function(total, currentValue, currentIndex, arr), initialValue) total–>初始值, 或者计算结束后的返回值,initialValue–>可选。传递给函数的初始值 | 接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值 | 返回计算结果 |
reduceRight() | (function(total, currentValue, currentIndex, arr), initialValue) | 功能和 reduce() 功能是一样的,不同的是 reduceRight() 从数组的末尾向前将数组中的数组项做处理 | 返回计算结果 |
slice() | (start, end) start与end都是可选形参,该参数为负数,则表示从原数组中的倒数第几个元素,范围为[arr[start], arr[end]),不传参时,返回整个数组 | 从已有的数组中返回选定的元素 | 返回形参范围内左闭右开的元素组成的数组 |
JavaScript中把数组转换为可迭代对象
通过数组的两个方法
方法名 | 参数 | 功能 | 返回值 |
---|---|---|---|
entries() | 无参 | 返回一个数组的迭代对象,该对象包含数组的键值对 (key/value) | 返回可迭代对象:迭代对象中数组的索引值作为 key, 数组元素作为 value |
key() | 用于从数组创建一个包含数组键的可迭代对象 | 无参 | 返回可迭代对象:数组的键值作为唯一值 |