- 数组可以用来存储一组相同类型的值
- 数组的存储会在内存中开辟一片连续的内存空间
- 可以通过索引直接获取数组中的元素,时间复杂度为O(1)
- 数组利查询,不利添加和删除操作,在数组中间插入和删除时,会导致大部分的数据存储位置发生移动
访问和迭代数组
- 可以通过下标的方式直接访问数组中的元素
- 迭代数组的方式
- for循环
- forEach
- map
- 等等
求斐波那契数列的第N项和前N项和
- 斐波那契数列规律
在末尾添加元素 - push
- push方法可以添加多个参数
// 1.原生的push方法let arr = [1, 2, 3, 4, 5];arr.push(6);console.log(arr);function _push(n, nums) {nums[nums.length] = n;}_push(7, arr);console.log(arr);
在开头添加元素 - unshift
- 可以添加多个参数
// 1.原生unshift方法let arr = [1, 2, 3];arr.unshift(0);console.log(arr);// 1.所有元素往后移动一位// 2.将添加的元素放在索引为0的位置function _unshift(nums, n) {for (let i = nums.length; i > 0; i--) {nums[i] = nums[i - 1];}nums[0] = n;return nums;}console.log(_unshift(arr, -1));
在中间插入元素
- 该位置往后的元素向后移动一位
// 1.该位置往后的元素向后移动一位// 2.将添加的元素放在该位置function _insert(nums, n, index) {// 比较数组的长度和插入位置if (nums.length - 1 > index) {for (let i = nums.length; i > index; i--) {nums[i] = nums[i - 1];}nums[index] = n;return nums;}nums[index] = n;return nums;}let arr = [1, 2, 3];console.log(_insert(arr, 4, 1));
删除元素
- 删除元素
- 在末尾删除元素,将末尾值设置为undefined
- 在开头删除元素,将每个元素都向前移动一位
- 在中间删除元素,将该位置之后的每个元素都向前移动一位
末尾删除元素 - pop
// 原生pop方法let arr = [1, 2, 3, 4, 5, 6, 7];arr.pop();console.log(arr);// 1.创建一个新的空数组// 2.通过push方法+遍历的手段将除了最后一项的元素添加到新数组function _pop(nums) {let newNums = [];for (let i = 0; i < nums.length - 1; i++) {newNums.push(nums[i]);}return newNums;}console.log(_pop(arr));
开头删除元素 - shift
- 所有元素向后移动一位
- 添加元素放在开头
// 原生shiftlet arr = [1, 2, 3, 4, 5, 6];arr.shift();console.log(arr);// 1.创建一个新的数组// 2.将除了第一位的元素遍历添加到新数组function _shift(nums) {let newNums = [];for (let i = 1; i < nums.length; i++) {newNums.push(nums[i]);}return newNums;}console.log(_shift(arr));
遍历多维数组
本质上就是遍历一维数组,需要用到for循环的嵌套
- 不要将内部的数组看成数组,先简单看成数值,优先遍历外层数组,再一层一层的遍历即可
let arr = [ // 先将数组看成[a,b,c],等遍历完完成数组后再将a,b,c看成数组对其进行遍历[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12, 13],];function traverse(arr) {for (let i = 0; i < arr.length; i++) {for (let j = 0; j < arr[i].length; j++) {console.log(arr[i][j]);}}}console.log(traverse(arr));
