数组常用方法的总结与实现

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

# 非变异方法

  • 非变异方法都会返回一个新的数组

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

# 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

原理

Array.of = function () {
  return Array.prototype.slice.call(arguments)
}
1
2
3

# Array.isArray(obj)

用于确定传递的值是否是一个 Array

原理

Array.isArray = function (arg) {
  return Object.prototype.toString.call(arg) === '[object Array]'
}
1
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

# reduce 实现

Last Updated: 10/21/2024, 4:15:17 PM