update: 数组排序

This commit is contained in:
qianguyihao 2020-06-14 22:29:29 +08:00
parent 6cb4f316de
commit adc06caa3f
2 changed files with 115 additions and 67 deletions

View File

@ -2,7 +2,7 @@
## 数组简介
数组Array是属于**内置对象**我们可以在[MDN](https://developer.mozilla.org/zh-CN/)网站上查询各种方法。
数组Array是属于**内置对象**我们可以在[MDN](https://developer.mozilla.org/zh-CN/)网站上查询它的各种方法。
数组和普通对象的功能类似也是用来存储一些值的不同的是

View File

@ -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() 比较保险这是一种良好的工作习惯
## 概念数组的遍历
遍历数组即获取并操作数组中的每一个元素在我们的实战开发中使用得非常频繁