JavaScript Array 数组相关的函数实现

数组函数 Apis

  1. reduce

reduce(arr, callbackFn, initialValue)

  1. callback 回调函数的合法性判断
  2. 数组合法性判断,如果数组为空数组且没有初始化值 initialValue 的时候视为非法情况
  3. 根据传入的参数计算 accumulator 的值,如果 initialValue 合法则为该值,如果没传就是数组第一个元素,如果传了就要去数组中找到第一个合法的数组元素
  4. 然后对数组每个元素执行 callbackFn 得到结果给 accumulator
  5. 最后返回 accumulator 的结果值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

/**
* Array.prototype.reduce
* @param {array} arr 原始函数
* @param {function} callback 回调函数
* @param {any} initialValue 初始值
* @returns {any} 处理后的结果
*/
const reduce = (arr, callback, initialValue) => {

const len = arr.length
const hasInitialValue = typeof initialValue !== 'undefined'

if (typeof callback !== 'function') {
throw new TypeError('invalid function')
}

if (len === 0 && !hasInitialValue) {
throw new TypeError('empty array and no initialize value.')
}

let k = 0,
accumulator = undefined,
kPresent = true,
pk = ''

if (hasInitialValue) {
accumulator = initialValue
} else {
kPresent = false
while (k < len && kPresent === false) {
pk = '' + k
kPresent = arr.hasOwnProperty(pk)

if (kPresent) {
// 取出数组元素
accumulator = arr[pk]
}

k++
}

// 没有找到说明没有指定的下标元素
if (kPresent === false) {
throw new TypeError('invalid index.')
}
}

// 上面计算出 accumulator 的值作为第一个值
let kValue = 0

while (k < len) {
pk = '' + k
kPresent = arr.hasOwnProperty(pk)
if (kPresent) {
kValue = arr[pk]
accumulator = callback(accumulator, kValue, k, arr)
}

k++
}

return accumulator
}

// 测试
// 1. 求和,无初始值
let res = reduce(
[1, 2, 3],
(accumulator, currValue, currIdx, arr) => accumulator + currValue
)
console.log('求和,无初始值: ' + res)
// 1. 求和,带初始值
res = reduce(
[1, 2, 3],
(accumulator, currValue, currIdx, arr) => accumulator + currValue,
10
)
console.log('求和,初始值 10: ' + res)

+RESULTS:

求和,无初始值: 6
求和,初始值 10: 16

本文标题:JavaScript Array 数组相关的函数实现

文章作者:ZhiCheng Lee

发布时间:2019年04月22日 - 16:01:45

最后更新:2019年04月22日 - 16:01:45

原始链接:http://blog.gcl666.com/2019/04/22/js-array-function-polyfill/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%