前言
本文主要从应用讲一些数组api的骚操作,如一行代码就实现扁平化n维数组、数组去重、求数组最大值、数组求和、排序、对象和数组的转化等。
扁平化n维数组
一行代码实现
1 | [1,[2,3]].flat(2) // [1,2,3] |
Array.flat(n)
是ES10扁平数组的api,n
表示维度,n
值为Infinity
时维度为无限大。
一般方式实现
1 | function flatten(arr) { |
实质是利用递归和数组合并的方式concat
实现扁平。
数组元素去重
一行代码实现
1 | Array.from(new Set([1,2,3,3,4,4])) // [1,2,3,4] |
Set
是ES6新出来的一种定义不重复数组的数据类型。Array.from
是将类数组转化为数组。...
是扩展运算符,将Set
里面的值转化为字符串。
一般方式实现
1 | Array.prototype.distinct = function () { |
实质是新建立一个数组存值,循环两个数组值相比较。
数组排序
一行代码实现
1 | [1,2,3,4].sort() // [1,2,3,4] 默认升序 |
sort
是js内置的排序方法,参数为一个函数
一般方法实现
冒泡排序:1
2
3
4
5
6
7
8
9
10
11
12
13
14Array.prototype.bubleSort = function () {
let arr = this,
len = arr.length;
for(let outer=len; outer>= 2; outer--) {
for(let inner=0; inner<=outer-1; inner++) {
if(arr[inner] > arr[inner+1]) {
// 升序
[arr[inner], arr[inner+1]] = [arr[inner+1], arr[inner]];
}
}
}
return arr;
}
[1,3,2,4].bubleSort() // [1,2,3,4]
选择排序:1
2
3
4
5
6
7
8
9
10
11
12
13Array.prototype.selectSort = function () {
let arr = this;
len = arr.length;
for(let i=0; i<len; i++) {
for(let j=i; j<len; j++) {
if(arr[i] > arr[j]) {
[arr[i], arr[j]] = [arr[j], arr[i]];
}
}
}
return arr;
}
[1,2,3,4].selectSort(); // [1,2,3,4]
寻找数组最大值
一行代码实现
1 | Math.max(...[1,2,3,4]) // 4 |
Math.max()
是Math
对象内置的方法,参数是字符串。reduce
是ES5的数组的api,参数有函数和默认初始值。
函数有四个参数:
pre
: 上一次的返回值cur
: 当前值curIndex
: 当前索引值arr
: 当前数组
一般方式实现
先排序再取值。
数组求和
一行代码实现
1 | [1,2,3,4].reduce(function (prev, cur) { |
一般方式实现
1 | function sum(arr) { |
利用slice
截取改变数组,再利用递归求和,当然迭代更好。
数组合并
一行代码实现
1 | [1,2,3,4].concat([5,6]) // [1,2,3,4,5,6] |
一般方式实现
1 | [5,6].map(item => { |
数组判断是否包含值
一行代码实现
1 | [1,2,3].includes(4) // false |
includes()
、find()
、findIndex()
是ES6的api。
一般方式实现
1 | [1,2,3].some(item => { |
类数组转化
一行代码实现
1 | Array.prototype.slice.call(arguments) |
类数组: 表示有length
属性,但是不具备数组的方法。call
、apply
: 改变slice
里面的this
指向arguments
,所以arguments
也可以调用数组的方法。...
: 将类数组扩展为字符串,再定义为数组。
一般方式实现
1 | Array.prototype.slice = function (start, end) { |
数组每一项设置值
一行代码实现
1 | [1,2,3].fill(false) // [false, false, false] |
fill
是ES6的方法。
一般方式实现
1 | [1,2,3].map(()=> 0) |
数组每一项是否满足条件
一行代码实现
1 | [1,2,3].every(item => {return item>2}) // false |
every
是ES5的api,每一项满足返回true
。
数组有一项满足条件
1 | [1,2,3].some(item => {return item>2}) // true |
some
是ES5的api,有一项满足返回true
。
过滤数组
一行代码实现
1 | [1,2,3].filter(item => {return item>2}) // [3] |
filter
是ES5的api,返回满足条件的元素数组。
对象和数组转化
一行代码实现
1 | Object.keys({name: "张三", age: 14}) // ['name', 'age'] |