Skip to the content.

数组的方法

数组方法中的回调函数中参数2都可以改变回调函数中的this的指向。

[TOC]

1 循环数组forEach

使用方法:对应的值和找到下标。

缺点:

  1. forEach不能选择从哪个位置开始循环。
  2. 不能停止break和跳过continue
    //语法
    arr.forEach(function(item,index,array){
     console.log(item,index,array)
    },可选参数2)
    

    通过参数2可以改变forEach中this的指向

    自己封装:

    var arr = [1,2,3,4,5,6];
    function foreach(arry,callback){
     for(var i=0; i<arr.length; i++){
         callback(arry[i],i)
     }
    }
    foreach(arr,function(a,b){
     console.log(a,b);
    })
    

2 将数组转为字符串arr.join(参数);

和split相反,没有参数时,默认用逗号连接,可以定义连接符, 参数定义连接符。

3 arr.push(参数1,参数2,··· )

向数组的末尾添加内容。会改变数组的内容 返回操作之后的长度

push的返回值是数组添加内容之后的长度。

4 arr.unshift(参数1,参数2,··· )

向数组的开头位置添加内容。会改变数组的内容 返回操作之后的长度

unshift的返回值是数组添加内容之后的长度。

5 arr.pop()

删除数组的末尾一项,没有参数 返回数组中删除的内容

默认删除最后一个,每次调用都会删除一项。返回值是删除的那一项。

6 arr.shift()

删除数组的开始一项,没有参数 返回数组中删除的内容

默认删除开始的一项,每次调用都会删除一项。返回值是删除的那一项。

7 arr.map(回调函数)

该方法会把回调函数执行结果拼成一个数组。返回该数组

var maps = arr.map(function(item){
	return `<li>${item}</li>`
//返回的是一个数组,将每一次执行完回调函数的值添加到这个数组的对应的位置
	})
	//list.innerHTML = maps;结构中都是字符串类型的,即使maps是数组,也会把它转为字符串,默认调用toString()方法,把逗号也转了,所以不能直接用。
list.innerHTML = maps.join('');

8 arr.filter(回调函数)

回调函数的返回值为true,那么就把循环到的这一项放到新数组中,在回调函数中,放入条件return 条件;将满足条件的项重新组成一个新的数组。并返回。

var arred = arr.filter(function(item){
	return item.age>25;
})

9 arr.concat();连接一个多个数组

var arr1 = [1,2,3]
var arr2 = [4,5,6]
var newarr = arr1.concat(arr2,['a','b'],'miaov')
// [1, 2, 3, 4, 5, 6, "a", "b", "miaov"]

括号中没有参数时,返回的是arr1,但是不是arr1,而是一个新数组

10 arr.reverse();颠倒数组,翻转数组

var arr3 = [1,2,3,4]
console.log(arr3.reverse())
//[4, 3, 2, 1]
会改变原来的数组顺序。不接受任何参数。

11 arr.slice(参数1,参数2);截取指定位置的数组

var arr4 = [1,2,3,4]
console.log(arr4.slice())//[1, 2, 3, 4]
console.log(arr4.slice(1,3))//[2, 3]
console.log(arr4.slice(2))//[3, 4]
console.log(arr4.slice(-1))//[4]
console.log(arr4)//[1, 2, 3, 4]

没有参数时,默认截取整个数组,从头截到尾。 参数1定义开始位置,参数2定义结束位置前的。 接收负数,arr4.slice(-1),截取的是最后一个。 只有一个参数时,从该位置截取到结尾

12 arr.splice(参数1,参数2,参数3);截取指定个数后组成数组

参数1开始位置,参数2截取个数,参数3是替换的值;可以为多个

会改变原来数组的值,分情况:1参数为空 2参数正常两个 3参数为一个 4参数为三个 ```
var arr5 = [1,2,3,4,5,6]

console.log(arr5.splice())
//为空数组
console.log(arr5)
//[1, 2, 3, 4, 5, 6]    返回的新的数组,和原来相似

console.log(arr5.splice(2,3))
//[3, 4, 5]
console.log(arr5)
// [1, 2, 6]    会改变原数组

console.log(arr5.splice(2))
//[3, 4, 5, 6]  一个参数从指定位置截取到结尾位置
console.log(arr5)
//[1, 2]


console.log(arr5.splice(2,3,'a','b'))
//[3, 4, 5]     替换
console.log(arr5)
//[1, 2, "a", "b", 6]   替换 ```

静态属性和静态方法

自定义的属性,挂在函数上的属性,属于静态属性 给函数属性定义一个函数,属于静态方法

13 数组的静态方法from,isArray

console.log(Array.isArray(lisarr)) //true

第二个参数时一个回调函数,将类数组的每一项做进一步处理,将回调函数中return后的值放入新生成的数组中。
第三个参数改变函数this的指向。

        转完之后可以调用数组的所有方法
    
* 判断类型是否为数组Array.isArray(值)

### 14 arr.indexOf(参数)


## for in循环
每一次循环的时候都会把对象的key值赋值给变量
`for(var attr in obj){}//attr都是字符串`

    数组的的key值是类型为字符串的下标。循环数组就用for循环,循环对象就用for in。也可以用for循环,但是key值必须是数字从0开始。手动添加length属性。

对象没有length属性,需手动添加。

## 冒泡排序
冒泡排序

    依次比较数组两个值,按大小条件交换位置,持续重复的比较,直到没有再需要交换为止,说明该数组排序完成了。
    
以下是从小到大排序步骤:

*  比较数组中每一对相邻的元素,
						           如果第一个比第二个大,就交换他们两个。从数组第一对到结尾的最后一对
* 经过一轮比较之后,会把最大的排到末尾
						
* 针对所有的元素重复第一步,除了最后一个(因为已经是最大值)。

* 持续每次对越来越少的元素重复第一步,直到没有任何一对数字需要比较。


**1 第一种方法:通过第三方赋值**

var arr = [1,8,3,4,7,2,0,4]

for(var j=0; j<arr.length-1; j++){ //0,1 1,2 2,3 length-2,length-1 第0个j找的是第1个最大值 for( var i=0; i<arr.length-1-j; i++ ){ //每一次找到最大值后就不用比较最后的最大值了 if(arr[i]>arr[i+1]){ var c = arr[i] arr[i] = arr[i+1] arr[i+1] = c } } }


**2 第二种方法:通过数组运算**

var arr = [1,8,3,4,7,2,0,4]

for(var j=0; j<arr.length-1; j++){ //0,1 1,2 2,3 length-2,length-1 第0个j找的是第1个最大值 for( var i=0; i<arr.length-1-j; i++ ){ //每一次找到最大值后就不用比较最后的最大值了 if(arr[i]>arr[i+1]){ arr[i]=[arr[i+1],arr[i+1]=arr[i]][0] } }

console.log(arr) } ```

递归

定义:函数自己调用自己(程序调用自身的编程技巧称为递归)
条件:当递归的时候,需要有一个条件让递归停下来
只有函数执行完成之后才有返回值。
function fn(n){
	if(n<=1) return n;
	return fn(n-1) + n;
}
console.log(fn(3))//6

快速排序

这种排序的思想是数组中的每个元素与基准值,数组中比基准值小的放在基准值的左边,形成左部;大的放在右边,形成右部;接下来将左部和右部分别递归地执行上面的过程:选基准值,小的放在左边,大的放在右边。。。直到排序结束。

以下是从小到大排序步骤:

  1. 从数组张找出一个元素作为基准,pivot=数组.shift()
  2. 分区(Partition):比基准值小的放左边,大的放右边,基准值(Pivot)放左部与右部的之间。
  3. 对左边和右边分区进行递归操作,重复以上步骤 ``` var arr = [1,8,3,4,7,2,4,9,0,4]

function speed(date){ if(date.length<=1) return date;//数组中还剩一个值时没必要再执行了 var pivot = date.shift();//取数组中的第一个拿出,不参与比较 var left = []; var right = []; for(var i=0; i<date.length; i++){ if(date[i]<pivot){ left.push(date[i])//小的放在左边 }else{ right.push(date[i])//大的放在右边 } } return speed(left).concat(pivot,speed(right))//分别拿左边的数组和右边的数组再次调用speed快速排序,用concat连接左小右大 } console.log(speed(arr))// [0, 1, 2, 3, 4, 4, 4, 7, 8, 9]





|  左  | 5,8,4 | 右  |
| :-------: | :-----:  | :----:  |
|      4     | 5(取出的参考值) |  8  |
|      4     |     5       |       8       |
| 组成新的数组: |4,5,8|   |


## sort排序

var arr = [5,21,0,9,12,3,8,0,1] arr.sort(); console.log(arr) //[0, 0, 1, 12, 21, 3, 5, 8, 9]


    默认是按字符串排序的,按第一位排序,引用ASCII编码。'2'>11; '20'>'2';

#### 带参数的sort排序
- return后的是一个新的数组。

var arr = [1,8,3,4,7,2,4,9,0,4]

arr.sort(function(a,b){ return a-b;//return后是正数,互换位置,负数或0,不换位置。相当于拿出1和8,1-8<0,不换位置,8-3>0,则互换位置。 }) console.log(arr)//[0, 1, 2, 3, 4, 4, 4, 7, 8, 9]

## 数组去重

* 方法1

var arr = [5,6,5,8,1,2,8,4,9,3,1,2,4,7] var arrNo = [] for( var i=0; i<arr.length; i++ ){ var onOff = false; for( var j=0; j<arrNo.length; j++ ){ if(arr[i] === arrNo[j]){//如果原数组中的第i个依次和新数组中的数比较后都不相等,说明跟目前的新数组的数不重复;相等的话,说明跟新数组中的数有重复的,把开关设为true, onOff = true; break; } } if(!onOff){//不重复的话就在新数组循环完成后,把第i个数放入新数组中 arrNo.push(arr[i])//[5,6,8,1,2,4,9,3,7] } } console.log(arrNo)//[5,6,8,1,2,4,9,3,7]

* 方法2:利用数组方法indexOf找重复的值

var arr = [5,6,5,8,1,2,8,4,9,3,1,2,4,7] var arrNo = [] for( var i=0; i<arr.length; i++ ){ if(arrNo.indexOf(arr[i]) == -1){//说明没有找到 arrNo.push(arr[i]) } } console.log(arrNo)//[5, 6, 8, 1, 2, 4, 9, 3, 7]


* 方法3:利用对象key值得唯一性判断比较

var arr = [5,6,5,8,1,2,8,4,9,3,1,2,4,7] var arrNo = [] var obj = {} for( var i=0; i<arr.length; i++ ){ if(!obj[arr[i]]){//没有这个key值时,说明新数组中没有重复的 arrNo.push(arr[i])//添加进新数组中 obj[arr[i]] = 1;//把对象的这个属性赋值:obj{5:1} } } console.log(arrNo)//[5, 6, 8, 1, 2, 4, 9, 3, 7]


## 从0-100找10个不重复的数
* 方法1
```javascript
var arr1 = [];
var obj = {};
for(var i=0;arr1.length<10;i++){//用arr1的长度作为判断条件进行判断
	var n = Math.round(Math.random()*100)
	if(!obj[n]){
		arr1.push(n)
	}
}
console.log(arr1)