数组常用方法的总结与实现
Alphawq Array
# 概览
# 变异方法
- 变异方法会修改原有的数组实例
pop、push、shift、unshift、reverse、sort、splice、copyWithin、fill
# copyWithin(target, start, end)
将数组中从 start 位置开始到 end 位置(不包括)结束的元素,复制到 从 target 位置开始,到 target + (end - start) 位置结束的地方
const array1 = ['a', 'b', 'c', 'd', 'e']
console.log(array1.copyWithin(0, 3, 5)) // ["d", "e", "c", "d", "e"]
1
2
3
2
3
# 非变异方法
- 非变异方法都会返回一个新的数组
slice、join、concat
# 遍历方法
forEach、map、every、reduce、some、filter、reduceRight
下列方法返回迭代器
keys、values、entries
# 检索方法
includes、indexOf、lastIndexOf、find、findInex
# 其他方法
flat、flatMap
# 静态方法
Array.from、Array.of、Array.isArray
# Array.from(arrayLike[, mapFn[, thisArg]])
// 数组去重合并
function combine() {
let arr = [].concat.apply([], arguments) //没有去重复的新数组
return Array.from(new Set(arr), (x) => x * 2)
}
var m = [1, 2, 2],
n = [2, 3, 3]
console.log(combine(m, n)) // [2, 4, 6]
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# Array.of(element0[, element1[, ...[, elementN]]])
创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型
与 Array 构造器的区别
Array.of(7) // [7]
Array.of(1, 2, 3) // [1, 2, 3]
Array(7) // [ , , , , , , ]
Array(1, 2, 3) // [1, 2, 3]
1
2
3
4
5
2
3
4
5
原理
Array.of = function () {
return Array.prototype.slice.call(arguments)
}
1
2
3
2
3
# Array.isArray(obj)
用于确定传递的值是否是一个 Array
原理
Array.isArray = function (arg) {
return Object.prototype.toString.call(arg) === '[object Array]'
}
1
2
3
2
3
# splice 实现
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])
# 入参
- start: 指定修改的开始位置(从 0 计数)
- 如果超出了数组的长度,则从数组末尾开始添加内容
- 如果是负值,则表示从数组末位开始的第几位(从 -1 计数)
- 如果负数的绝对值大于数组的长度,则表示开始位置为第 0 位
- deleteCount:
[可选]
要删除的元素个数(含第 start 位)- 不传的话,删除从 start 到最后所有元素
- 传 0 的话,不删除元素
- args:
[可选]
要插入的元素
# 返回值
返回被删除的元素组成的一个数组
# 实现
// Array.prototype._splice = function () {
// let start = 0
// let self = this
// let delCount = 0
// let delArr = []
// let insertArr = []
// let selfLen = self.length
// let args = Array.prototype.slice.call(arguments)
// start = args[0]
// delCount = args[1]
// insertArr = args.slice(2)
// if (start < 0) {
// start = start + len > 0 ? start + len : 0
// }
// start > len ? len : start
// }
// let arr = [1, 2, 3, 4, 5]
// arr._splice(0, 2, 0, 1)
// let arr2 = [1, 2, 3, 4, 5]
// arr2._splice(0, 3, 0, 1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22