数组
数组主要属性
概念:
数组一般是由相同类型的元素组成的集合,也是对象;
一,定义:
方式 1,new 数组名 (参数,参数,…)
只有一个数字参数时是数组的长度(new 可以省略,但一般尽量写上)
var 数组名 = new Array(); //定义一个空数组
var 数组名 = new Array(10); //创建一个包含 10 个元素的数组,没有赋值
var 数组名 = new Array("孙悟空",100); //创建一个数组有两个元素
方式 2,var 数组名 = [1, 2, 3, 4, 5] 字面量定义方式
var onelist = ["one", 1, null]; //定义一个数组 onelist
二,数组元素的获取
arr[ 0 ] : 表示数组的第 1 个元素 , 他是下标,从 0 开始也叫索引;
注意:下标可以是变量或表达式
arr.length length 属性,不仅是可读的,也可以设置;
var arr = []; //定义一个空数组
arr.length = 4; //可以将其长度改为4
console.log(arr); //输出 四个 空默认为实体类型 empty 打印的值仍是undefined
三,for……in 可遍历数组(一般用来遍历对象)
for (var i in 数组名) {
console.log(数组名[i]);
}
//例
var onelist = ["one", 1, null];
for (var i in onelist) {
console.log(onelist[i]);
}
输出如下图:
数组的常用方法(书写时别忘记后的小括号)
容器都能够进行 增删改查;变量是一个容器,数组也是一个容器;
一,栈方法 : push( ) 和 pop( )
栈:遵循 先进后出 的原则;
push() 增加值的方法 追加到后面,返回数组长度; push 英语意思为:推,推入,放入;
pop() 删除值的方法 删除最后一个元素,返回这个被删除的元素; pop 英语意思为:弹出;
二,队列方法 : shift( ) 和 unshift( )
队列:遵循 先进先出 的原则;
unshift() 增加的方法 放到最前面,返回数组长度; unshift 英语意思为:未移动,从数组头部;
shift() 删除的方法 删除第一元素,返回这个被删除的元素; shift 英语意思为:移位,从数组头部;
三,排序方法: reverse( ) 和 sort( )
sort() 排序:默认根据 ASCII 码 从小到大排序,两位或以上的数字会自动转换为 string 类型,只取第一位数。如 12 取 1 的 ASCII 码比较;
但我们可以通过比较函数进行排序:
arr.sort(function (a, b) {
return a - b; //返回为 正 为正序
});
arr.sort(function (a, b) {
return b - a; //返回为 负 为倒序
});
reverse() 反转:将之前的数组元素全倒过来,改变原有数组;没有参数;返回值为改变后的数组。
var arr = [1, 2, 3];
var arrResver = arr.reverser(); //它的返回值和原数组指向的同一个地址
arr == arrResver; //true
arr === arrResver; //true
四,数组操作的方法
concat() 连接,合并:两个或多个数组,可以连接值;追加数据,把连接的数组或值放在后面, 创建一个新数组, 不改变原数组
var arr1 = [1, 2, 3];
var arr2 = [4, 5, 6];
var newarr = arr1.concat(arr2);
console.log(newarr); //输出 [1,2,3,4,5,6]
join() 连接:连接成为字符串 有分割符,不会影响原来的数组,返回值为 string
var arr1 = [1, 2, 3];
var newarr = arr1.join(); //无分割符,默认 ,号分割
var newarr1 = arr1.join("/"); //以 / 为分割符
console.log(newarr); //输出 1,2,3
console.log(newarr1); //输出 1/2/3
slice() 截取: 不修改原数组,将原数组中的指定区域数据提取出来,返回的是一个新的数组;
var arr1 = [1, 2, 3];
var newarr = arr1.slice(0, 1);
// 0 代表开始截取位置 1 代表结束截取位置 不包含结束位置的值
console.log(newarr); //输出 [1]
splice() 增删改: 截取原数组中指定的数据, 会改变原数组
1,删除 (开始下标 删除的个数)(个数可以被省略,就是删到最后)
var arr = [1, 2, 3];
var newarr = arr.splice(0, 1); //返回 被删除元素组成的数组
console.log(newarr); //输出 [1]
console.log(arr); //输出 [2,3]
var arr1 = [1, 2, 3];
var newarr1 = arr.splice(0);
console.log(newarr1); //输出 [1,2,3]
console.log(arr1); //输出 []
2,插入 (开始下标,删除的个数,”新元素”)插入元素到指定位置,将删除个数改为 0 ,不删除元素,直接插入新元素;
var arr = [1, 2, 3];
var newarr = arr.splice(0, 0, 4); //返回 被删除元素组成的数组
console.log(newarr); //输出 []
console.log(arr); //输出 [4,1,2,3]
var arr1 = [1, 2, 3];
var newarr1 = arr1.splice(1, 0, 4);
console.log(newarr1); //输出 [] 空数组
console.log(arr1); //输出 [1,4,2,3]
3,替换 将删除位置的数据替换,删除数据位置要输入新的值
var arr = [1, 2, 3];
var newarr = arr.splice(0, 1, 4); //返回 被删除元素组成的数组
console.log(newarr); //输出 [1]
console.log(arr); //输出 [4,2,3] 已删除并替换掉
注意: splice 和 slice 的区别
indexOf() 查找: 根据对应的值找下标,找的是值第一次出现的位置,返回它的下标;默认从下标 0 开始找,没有找到则返回 - 1;
var arr = [1, 1, 2, 3, 4, 1];
arr.indexOf(1); //返回 0
arr.indexOf(1, 2); //返回 5
arr.indexOf(1, 10); //返回 -1
lastIndexOf() 查找: 从后往前找; 根据对应的值找下标,找的是值第一次出现的位置,返回它的下标;默认从最后一个开始找,没有找到则返回 - 1;
数组排序
排序算法是属于数据结构的知识点 一般常见的排序有 10 种
1,冒泡排序法:逐个冒泡到上面,从下往上。
逐层冒泡 第一次冒泡执行的次数为当前数组的长度减一;
冒泡的总次数为长度减一
j 和 j+1 比较 比较完后判断是否交换位置
冒泡的比较次数一次比一次少 最后到达一次结束
//冒泡排序法
function maopao(array) {
//冒泡执行的次数
for (i = 1; i < array.length - 1; i++) {
//冒泡每次执行比较的次数
for (j = 0; j < array.length - i; j++) {
//把第一位和后一位进行比较 逐层冒泡
if (array[j] > array[j + 1]) {
var temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
var arr = [2, 1, 4, 8, 7, 5, 4];
maopao(arr);
console.log(arr);
2,选择排序法
每次选择当前的第一个数为最小值;
这个值跟后面的所有值去比较 然后对应的比我这个值还小的 就把下标记起来 赋值给 min;
判断 min 是否是之前给到的值, 如果是 不做操作,如果不是 交换位置;
//选择排序
function selcetarr(array) {
//初始最小值得下标 和总选择次数
for (i = 0; i < array.length - 1; i++) {
var min = i; //每次比较值得下标 从左至右
for (j = i + 1; j < array.length; j++) {
//从第二个开始 然后在和声明好的min下标值比较
if (array[min] > array[j]) {
min = j;
}
}
if (min != i) {
//如果当前的最小值的下标不是之前的下标 就替换掉 因为需要下一个值得比较
var temp = array[i];
array[i] = array[min];
array[min] = temp;
}
}
}
3,插入排序法
从后往前比,初始下标为 1 ,
//插入排序()第一种 会无法识别中途从第一位插入的数值
function insent(array){
//外层的循环次数 是从第二个数也就是下标为 1 的数开始,因为是从后往前比
for(i=1; i<array.length; i++){
//内部比较 记住是 从后往前比 就是所以是 j--
for(j=i; j>0; j--){
//比较大小 然后交换数值
if(array[j-1]>array[j]){
var temp = array[j-1]
array[j-1] = array[j]
array[j] = temp
}
}
}
}
//插入排序(第二种)一般选择它
function whileinsertion(array){
for(i=1; i<array.length; i++){
var arrindex = i-1 //获取前一个的下标
var cuont = array[i] //保存当前的值 防止丢失
while(arrindex>=0; && cuont < array[arrindex]){
//如果前一个的值大于等于 0 并且值小于上一个
array[arrindex+1] = array[arrindex] //交换
arrindex--
}
array[arrindex+1] = cuont
}
}
4,快速排序(冒泡升级)
核心 利用二分法和递归;
function quicksort(arr) {
//递归的边界;最终排到中间值就是自己,则结束;
if (arr.length <= 1) {
return arr;
}
//取出相对中间下标,和它的值;定义好两个数组;
let index = Math.round(arr.length / 2);
let centerNumber = arr.splice(index, 1);
let leftarr = [];
let rightarr = [];
for (let i = 0; i < arr.length; i++) {
//判断,比中间值小的,往左边放,大的往右边放;
if (arr[i] < centerNumber) {
leftarr.push(arr[i]);
} else {
rightarr.push(arr[i]);
}
}
//递归
return quicksort(leftarr).concat(centerNumber, quicksort(rightarr));
}