update: 数组排序
This commit is contained in:
		
							parent
							
								
									6cb4f316de
								
							
						
					
					
						commit
						adc06caa3f
					
				@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
## 数组简介
 | 
			
		||||
 | 
			
		||||
数组(Array)是属于**内置对象**,我们可以在[MDN](https://developer.mozilla.org/zh-CN/)网站上查询各种方法。
 | 
			
		||||
数组(Array)是属于**内置对象**,我们可以在[MDN](https://developer.mozilla.org/zh-CN/)网站上查询它的各种方法。
 | 
			
		||||
 | 
			
		||||
数组和普通对象的功能类似,也是用来存储一些值的。不同的是:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2,28 +2,28 @@
 | 
			
		||||
 | 
			
		||||
**数组的类型相关**:
 | 
			
		||||
 | 
			
		||||
| 方法                             | 描述                                 | 备注 |
 | 
			
		||||
| :------------------------------- | :----------------------------------- | :--- |
 | 
			
		||||
| Array.isArray()                  | 判断是否为数组                       |      |
 | 
			
		||||
| toString()                       | 将数组转换为字符串                   |      |
 | 
			
		||||
| Array.from(arrayLike)            | 将**伪数组**转化为**真数组**         |      |
 | 
			
		||||
| 方法                             | 描述                               | 备注 |
 | 
			
		||||
| :------------------------------- | :--------------------------------- | :--- |
 | 
			
		||||
| Array.isArray()                  | 判断是否为数组                     |      |
 | 
			
		||||
| toString()                       | 将数组转换为字符串                 |      |
 | 
			
		||||
| Array.from(arrayLike)            | 将**伪数组**转化为**真数组**       |      |
 | 
			
		||||
| Array.of(value1, value2, value3) | 创建数组:将**一系列值**转换成数组 |      |
 | 
			
		||||
 | 
			
		||||
注意,获取数组的长度是用`length`属性,不是方法。关于 `length`属性,详见上一篇文章。
 | 
			
		||||
 | 
			
		||||
**数组元素的添加和删除**:
 | 
			
		||||
 | 
			
		||||
| 方法      | 描述                                                             | 备注           |
 | 
			
		||||
| :-------- | :--------------------------------------------------------------- | :------------- |
 | 
			
		||||
| push()    | 向数组的**最后面**插入一个或多个元素,返回结果为**新数组的长度** | 会改变原数组   |
 | 
			
		||||
| pop()     | 删除数组中的**最后一个**元素,返回结果为**被删除的元素**         | 会改变原数组   |
 | 
			
		||||
| unshift() | 在数组**最前面**插入一个或多个元素,返回结果为**新数组的长度**   | 会改变原数组   |
 | 
			
		||||
| shift()   | 删除数组中的**第一个**元素,返回结果为**被删除的元素**           | 会改变原数组   |
 | 
			
		||||
|           |                                                                  |                |
 | 
			
		||||
| slice()   | 从数组中**提取**指定的一个或多个元素,返回结果为**新的数组**     | 不会改变原数组 |
 | 
			
		||||
| splice()  | 从数组中**删除**指定的一个或多个元素,返回结果为**被删除元素组成的新数组**     | 会改变原数组   |
 | 
			
		||||
|           |                                                                  |                |
 | 
			
		||||
| fill()    | 填充数组:用固定的值填充数组,返回结果为**新的数组**                       |    不会改变原数组            |
 | 
			
		||||
| 方法      | 描述                                                                       | 备注           |
 | 
			
		||||
| :-------- | :------------------------------------------------------------------------- | :------------- |
 | 
			
		||||
| push()    | 向数组的**最后面**插入一个或多个元素,返回结果为**新数组的长度**           | 会改变原数组   |
 | 
			
		||||
| pop()     | 删除数组中的**最后一个**元素,返回结果为**被删除的元素**                   | 会改变原数组   |
 | 
			
		||||
| unshift() | 在数组**最前面**插入一个或多个元素,返回结果为**新数组的长度**             | 会改变原数组   |
 | 
			
		||||
| shift()   | 删除数组中的**第一个**元素,返回结果为**被删除的元素**                     | 会改变原数组   |
 | 
			
		||||
|           |                                                                            |                |
 | 
			
		||||
| slice()   | 从数组中**提取**指定的一个或多个元素,返回结果为**新的数组**               | 不会改变原数组 |
 | 
			
		||||
| splice()  | 从数组中**删除**指定的一个或多个元素,返回结果为**被删除元素组成的新数组** | 会改变原数组   |
 | 
			
		||||
|           |                                                                            |                |
 | 
			
		||||
| fill()    | 填充数组:用固定的值填充数组,返回结果为**新的数组**                       | 不会改变原数组 |
 | 
			
		||||
 | 
			
		||||
**数组的合并和拆分**:
 | 
			
		||||
 | 
			
		||||
@ -36,10 +36,11 @@
 | 
			
		||||
注意,`split()`是字符串的方法,不是数组的方法。
 | 
			
		||||
 | 
			
		||||
**数组排序**:
 | 
			
		||||
| 方法 | 描述 | 备注 |
 | 
			
		||||
| :-------- | :----------------------------------------------------------------- | :------------- |
 | 
			
		||||
| reverse() | 反转数组,返回结果为**反转后的数组** | 会改变原数组 |
 | 
			
		||||
| sort() | 对数组的元素,默认按照**Unicode 编码**,从小到大进行排序 | 会改变原数组 |
 | 
			
		||||
 | 
			
		||||
| 方法      | 描述                                                    | 备注         |
 | 
			
		||||
| :-------- | :------------------------------------------------------ | :----------- |
 | 
			
		||||
| reverse() | 反转数组,返回结果为**反转后的数组**                    | 会改变原数组 |
 | 
			
		||||
| sort()    | 对数组的元素,默认按照**Unicode 编码**,从小到大进行排序 | 会改变原数组 |
 | 
			
		||||
 | 
			
		||||
**遍历数组**:
 | 
			
		||||
 | 
			
		||||
@ -303,13 +304,12 @@ console.log('result5:' + JSON.stringify(result5));
 | 
			
		||||
打印结果:
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
 | 
			
		||||
arr:["a","b","c","d","e","f"]
 | 
			
		||||
result1:["a","b","c","d","e","f"]
 | 
			
		||||
result2:["c","d","e","f"]
 | 
			
		||||
result3:["e","f"]
 | 
			
		||||
result4:["c","d"]
 | 
			
		||||
result5:[]
 | 
			
		||||
arr: ['a', 'b', 'c', 'd', 'e', 'f'];
 | 
			
		||||
result1: ['a', 'b', 'c', 'd', 'e', 'f'];
 | 
			
		||||
result2: ['c', 'd', 'e', 'f'];
 | 
			
		||||
result3: ['e', 'f'];
 | 
			
		||||
result4: ['c', 'd'];
 | 
			
		||||
result5: [];
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
**补充**:
 | 
			
		||||
@ -419,7 +419,6 @@ arr4:["a","千古壹号","vae","e","f"]
 | 
			
		||||
result4:["b","c","d"]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### fill()
 | 
			
		||||
 | 
			
		||||
`fill()`:用一个固定值填充数组,返回结果为**新的数组**。不会改变原数组。
 | 
			
		||||
@ -437,7 +436,6 @@ result4:["b","c","d"]
 | 
			
		||||
新数组 = 数组.fill(固定值, startIndex, endIndex);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
举例:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
@ -451,8 +449,9 @@ console.log(['a', 'b', 'c', 'd'].fill('f')); // ['f', 'f', 'f,' 'f']
 | 
			
		||||
console.log(['a', 'b', 'c', 'd'].fill('f', 1, 3)); // ["a", "f", "f", "d"]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## 素组的合并和拆分
 | 
			
		||||
 | 
			
		||||
## concat()
 | 
			
		||||
### concat()
 | 
			
		||||
 | 
			
		||||
`concat()`:连接两个或多个数组,返回结果为**新的数组**。不会改变原数组。`concat()`方法的作用是**数组合并**。
 | 
			
		||||
 | 
			
		||||
@ -494,7 +493,7 @@ result2 = ['a', 'b', 'c', 1, 2, 3, '千古壹号', 'vae'];
 | 
			
		||||
 | 
			
		||||
从打印结果中可以看到,原数组并没有被修改。
 | 
			
		||||
 | 
			
		||||
### 数组合并的另一种方式
 | 
			
		||||
**数组合并的另一种方式**:
 | 
			
		||||
 | 
			
		||||
我们可以使用`...`这种展开语法,将两个数组进行合并。举例如下:
 | 
			
		||||
 | 
			
		||||
@ -505,7 +504,7 @@ const result = ['a', 'b', 'c', ...arr1];
 | 
			
		||||
console.log(JSON.stringify(result)); // 打印结果:["a","b","c",1,2,3]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## join()
 | 
			
		||||
### join()
 | 
			
		||||
 | 
			
		||||
`join()`:将数组转换为字符串,返回结果为**转换后的字符串**(不会改变原来的数组)。
 | 
			
		||||
 | 
			
		||||
@ -536,20 +535,34 @@ console.log('result2 =' + JSON.stringify(result2));
 | 
			
		||||
 | 
			
		||||
上方代码中,最后三行的打印结果是:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
```bash
 | 
			
		||||
arr =["a","b","c"]
 | 
			
		||||
result1 =a,b,c
 | 
			
		||||
result2 =a-b-c
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### split()
 | 
			
		||||
 | 
			
		||||
> 注意,`split()`是字符串的方法,不是数组的方法。
 | 
			
		||||
 | 
			
		||||
语法:
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
新的数组 = str.split(分隔符);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
解释:通过指定的分隔符,将一个字符串拆分成一个**数组**。不会改变原字符串。
 | 
			
		||||
 | 
			
		||||
备注:`split()`这个方法在实际开发中用得非常多。一般来说,从接口拿到的 json 数据中,经常会收到类似于`"q, i, a, n"`这样的字符串,前端需要将这个字符串拆分成`['q', 'i', 'a', 'n']`数组,这个时候`split()`方法就派上用场了。
 | 
			
		||||
 | 
			
		||||
## reverse()
 | 
			
		||||
 | 
			
		||||
`reverse()`:反转数组,返回结果为**反转后的数组**(会改变原来的数组)。
 | 
			
		||||
 | 
			
		||||
语法:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
    反转后的数组  =  数组.reverse();
 | 
			
		||||
```js
 | 
			
		||||
反转后的数组 = 数组.reverse();
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
举例:
 | 
			
		||||
@ -574,20 +587,20 @@ result =["f","e","d","c","b","a"]
 | 
			
		||||
 | 
			
		||||
## sort()方法
 | 
			
		||||
 | 
			
		||||
> sort()方法要好好理解。所以,我们单独用一大段来讲。
 | 
			
		||||
> sort()方法需要好好理解。
 | 
			
		||||
 | 
			
		||||
`sort()`:对数组的元素进行从小到大来排序(会改变原来的数组)。
 | 
			
		||||
 | 
			
		||||
### sort()方法举例:无参时
 | 
			
		||||
### sort()方法:无参时
 | 
			
		||||
 | 
			
		||||
如果在使用 sort() 方法时不带参,则默认按照**Unicode 编码**,从小到大进行排序。
 | 
			
		||||
 | 
			
		||||
**举例 1**:(当数组中的元素为字符串时)
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
var arr1 = ['e', 'b', 'd', 'a', 'f', 'c'];
 | 
			
		||||
let arr1 = ['e', 'b', 'd', 'a', 'f', 'c'];
 | 
			
		||||
 | 
			
		||||
var result = arr1.sort(); // 将数组 arr1 进行排序
 | 
			
		||||
let result = arr1.sort(); // 将数组 arr1 进行排序
 | 
			
		||||
 | 
			
		||||
console.log('arr1 =' + JSON.stringify(arr1));
 | 
			
		||||
console.log('result =' + JSON.stringify(result));
 | 
			
		||||
@ -605,9 +618,9 @@ console.log('result =' + JSON.stringify(result));
 | 
			
		||||
**举例 2**:(当数组中的元素为数字时)
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
var arr2 = [5, 2, 11, 3, 4, 1];
 | 
			
		||||
let arr2 = [5, 2, 11, 3, 4, 1];
 | 
			
		||||
 | 
			
		||||
var result = arr2.sort(); // 将数组 arr2 进行排序
 | 
			
		||||
let result = arr2.sort(); // 将数组 arr2 进行排序
 | 
			
		||||
 | 
			
		||||
console.log('arr2 =' + JSON.stringify(arr2));
 | 
			
		||||
console.log('result =' + JSON.stringify(result));
 | 
			
		||||
@ -616,35 +629,39 @@ console.log('result =' + JSON.stringify(result));
 | 
			
		||||
打印结果:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
    arr2 =[1,11,2,3,4,5]
 | 
			
		||||
    result =[1,11,2,3,4,5]
 | 
			
		||||
arr2 =[1,11,2,3,4,5]
 | 
			
		||||
result =[1,11,2,3,4,5]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
上方的打印结果中,你会发现,使用 sort() 排序后,数字`11`竟然在数字`2`的前面。这是为啥呢?因为上面讲到了,`sort()`方法是按照**Unicode 编码**进行排序的。
 | 
			
		||||
 | 
			
		||||
那如果我想让 arr2 里的数字,完全按照从小到大排序,怎么操作呢?继续往下看。
 | 
			
		||||
 | 
			
		||||
### sort()方法举例:带参时
 | 
			
		||||
### sort()方法:带参时,自定义排序规则
 | 
			
		||||
 | 
			
		||||
如果在 sort()方法中带参,我们就可以**自定义**排序规则。具体做法如下:
 | 
			
		||||
 | 
			
		||||
我们可以在 sort()添加一个回调函数,来指定排序规则。回调函数中需要定义两个形参,浏览器将会分别使用数组中的元素作为实参去调用回调函数
 | 
			
		||||
我们可以在 sort()添加一个回调函数,来指定排序规则。回调函数中需要定义两个形参,浏览器将会分别使用数组中的元素作为实参去调用回调函数。
 | 
			
		||||
 | 
			
		||||
浏览器根据回调函数的返回值来决定元素的排序:(重要)
 | 
			
		||||
 | 
			
		||||
-   如果返回一个大于 0 的值,则元素会交换位置
 | 
			
		||||
 | 
			
		||||
-   如果返回一个小于 0 的值,则元素位置不变
 | 
			
		||||
-   **如果返回一个小于 0 的值,则元素位置不变**
 | 
			
		||||
 | 
			
		||||
-   如果返回一个 0,则认为两个元素相等,则不交换位置
 | 
			
		||||
-   如果返回一个等于 0 的值,则认为两个元素相等,则不交换位置
 | 
			
		||||
 | 
			
		||||
**代码举例**:
 | 
			
		||||
如果只是看上面的文字,可能不太好理解,我们来看看下面的例子,你肯定就能明白。
 | 
			
		||||
 | 
			
		||||
### 举例:将数组中的数字按照从小到大排序
 | 
			
		||||
 | 
			
		||||
**写法 1**:
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
var arr3 = [5, 2, 11, 3, 4, 1];
 | 
			
		||||
var arr = [5, 2, 11, 3, 4, 1];
 | 
			
		||||
 | 
			
		||||
// 自定义排序规则
 | 
			
		||||
var result = arr3.sort(function (a, b) {
 | 
			
		||||
var result = arr.sort(function (a, b) {
 | 
			
		||||
    if (a > b) {
 | 
			
		||||
        // 如果 a 大于 b,则交换 a 和 b 的位置
 | 
			
		||||
        return 1;
 | 
			
		||||
@ -657,44 +674,73 @@ var result = arr3.sort(function (a, b) {
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
console.log('arr3 =' + JSON.stringify(arr3));
 | 
			
		||||
console.log('arr =' + JSON.stringify(arr));
 | 
			
		||||
console.log('result =' + JSON.stringify(result));
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
打印结果:
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
arr3 = [1, 2, 3, 4, 5, 11];
 | 
			
		||||
arr = [1, 2, 3, 4, 5, 11];
 | 
			
		||||
result = [1, 2, 3, 4, 5, 11];
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
上方代码的写法太啰嗦了,其实也可以简化为如下写法:
 | 
			
		||||
 | 
			
		||||
**代码优化**:(冒泡排序)
 | 
			
		||||
**写法 2**:(冒泡排序)
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
var arr3 = [5, 2, 11, 3, 4, 1];
 | 
			
		||||
let arr = [5, 2, 11, 3, 4, 1];
 | 
			
		||||
 | 
			
		||||
// 自定义排序规则
 | 
			
		||||
var result = arr3.sort(function (a, b) {
 | 
			
		||||
let result = arr.sort(function (a, b) {
 | 
			
		||||
    return a - b; // 升序排列
 | 
			
		||||
    // return b - a; // 降序排列
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
console.log('arr3 =' + JSON.stringify(arr3));
 | 
			
		||||
console.log('arr =' + JSON.stringify(arr));
 | 
			
		||||
console.log('result =' + JSON.stringify(result));
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
打印结果:
 | 
			
		||||
打印结果不变。
 | 
			
		||||
 | 
			
		||||
```javascript
 | 
			
		||||
arr3 = [1, 2, 3, 4, 5, 11];
 | 
			
		||||
result = [1, 2, 3, 4, 5, 11];
 | 
			
		||||
上方代码还可以写成 ES6 的形式,也就是将 function 改为箭头函数,其写法如下。
 | 
			
		||||
 | 
			
		||||
**写法 3**:(箭头函数)
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
let arr = [5, 2, 11, 3, 4, 1];
 | 
			
		||||
 | 
			
		||||
// 自定义排序规则
 | 
			
		||||
let result = arr.sort((a, b) => {
 | 
			
		||||
    return a - b; // 升序排列
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
console.log('arr =' + JSON.stringify(arr));
 | 
			
		||||
console.log('result =' + JSON.stringify(result));
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
上方代码,因为函数体内只有一句话,所以可以去掉 return 语句,继续简化为如下写法。
 | 
			
		||||
 | 
			
		||||
**写法 4**:(推荐)
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
let arr = [5, 2, 11, 3, 4, 1];
 | 
			
		||||
 | 
			
		||||
// 自定义排序规则:升序排列
 | 
			
		||||
let result = arr.sort((a, b) => a - b);
 | 
			
		||||
 | 
			
		||||
console.log('arr =' + JSON.stringify(arr));
 | 
			
		||||
console.log('result =' + JSON.stringify(result));
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
上面的各种写法中,写法 4 是我们在实战开发中用得最多的。
 | 
			
		||||
 | 
			
		||||
为了确保代码的简洁优雅,接下来的代码中,凡是涉及到函数,我们将统一采用 ES6 中的箭头函数来写。
 | 
			
		||||
 | 
			
		||||
### sort 方法举例:将数组从小到大排序
 | 
			
		||||
 | 
			
		||||
将数组从小到大排序,这个例子很常见。
 | 
			
		||||
将数组从小到大排序,这个例子很常见。但在实际开发中,总会有一些花样。
 | 
			
		||||
 | 
			
		||||
下面这段代码,在实际开发中,经常用到,一定要掌握。完整代码如下:
 | 
			
		||||
 | 
			
		||||
@ -726,9 +772,7 @@ result = [1, 2, 3, 4, 5, 11];
 | 
			
		||||
            console.log('qianguyihao 排序前的数组:' + JSON.stringify(dataList));
 | 
			
		||||
 | 
			
		||||
            // 将dataList 数组,按照 publishTime 字段,从小到大排序。(会改变原数组)
 | 
			
		||||
            dataList.sort(function (a, b) {
 | 
			
		||||
                return parseInt(a.publishTime) - parseInt(b.publishTime);
 | 
			
		||||
            });
 | 
			
		||||
            dataList.sort((a, b) => parseInt(a.publishTime) - parseInt(b.publishTime));
 | 
			
		||||
 | 
			
		||||
            console.log('qianguyihao 排序后的数组:' + JSON.stringify(dataList));
 | 
			
		||||
        </script>
 | 
			
		||||
@ -742,14 +786,18 @@ result = [1, 2, 3, 4, 5, 11];
 | 
			
		||||
qianguyihao 排序前的数组:[
 | 
			
		||||
    {"title":"品牌鞋子,高品质低价入手","publishTime":200},
 | 
			
		||||
    {"title":"不是很贵,但是很暖","publishTime":100},
 | 
			
		||||
    {"title":"无法拒绝的美食,跟我一起吃吃","publishTime":300}]
 | 
			
		||||
    {"title":"无法拒绝的美食,跟我一起吃吃","publishTime":300}
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
qianguyihao 排序后的数组:[
 | 
			
		||||
    {"title":"不是很贵,但是很暖","publishTime":100},
 | 
			
		||||
    {"title":"品牌鞋子,高品质低价入手","publishTime":200},
 | 
			
		||||
    {"title":"无法拒绝的美食,跟我一起吃吃","publishTime":300}]
 | 
			
		||||
    {"title":"无法拒绝的美食,跟我一起吃吃","publishTime":300}
 | 
			
		||||
]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
上方代码中,有人可能会问: publishTime 字段已经是 int 类型了,为啥在排序前还要做一次 parseInt() 转换?这是因为,这种数据,一般是后台接口返回给前端的,数据可能是 int 类型、也可能是字符串类型,所以还是统一先做一次 partInt() 比较保险。这是一种良好的工作习惯。
 | 
			
		||||
 | 
			
		||||
## 概念:数组的遍历
 | 
			
		||||
 | 
			
		||||
遍历数组即:获取并操作数组中的每一个元素。在我们的实战开发中,使用得非常频繁。
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user