手动实现Array.prototype.map方法
Array.prototype.map 方法通过调用一个回调函数来进行映射,从而将每个数组项映射到新的项。它返回一个带有映射值的新数组。使用如下
<code>let result = arr.map(function(item, index, array) { // 返回新值而不是当前元素 })/<code>
我们可以实现它如下:
<code>const map = (arr, callback) => { if (!Array.isArray(arr)) { return []; } const newArr = []; for (let i = 0, len = arr.length; i < len; i++) { newArr.push(callback(arr[i], i, arr)); } return newArr; }/<code>
首先,我们检查 arr 是否为数组,如果不是,则返回一个空数组。
在上面的代码中,我们有 map 方法,它循环遍历每个数组项,并使用数组项、索引和传入的原始数组调用回调,每个条目都被推送到 newArr 数组。
然后它返回 newArr 数组,其中包含映射的项。
手动实现Array.prototype.filter方法
Array.prototype.filter 方法返回一个新数组,该数组从满足回调条件的原始数组中获取元素,将这些条目推入一个新数组,然后返回,使用如下:
<code>let results = arr.filter(function(item, index, array) { // 如果 true item 被 push 到 results,迭代继续 // 如果什么都没找到,则返回空数组 });/<code>
我们可以如下实现:
<code>const filter = (arr, callback) => { if (!Array.isArray(arr)) { return []; } const newArr = []; for (let i = 0, len = arr.length; i < len; i++) { if (callback(arr[i], i, arr)) { newArr.push(arr[i]); } } return newArr; }/<code>
在上面的代码中,我们首先检查 arr 是否为数组。如果不是,我们将返回一个空数组。然后我们循环遍历 arr,然后使用 if 块来检查回调调用是否返回 true,然后将这些条目推到 newArr 并返回它。
手动实现Array.prototype.reduce方法
Array.prototype.reduce 方法通过重复调用回调以将数组项组合为一个值,从而将数组的项组合为一个。使用如下
<code>let value = arr.reduce(function(accumulator, item, index, array) { // ... }, [initial]);/<code>
该函数一个接一个地应用于所有数组元素,并将其结果“搬运”到下一个调用。
参数:
- accumulator – 是上一个函数调用的结果,第一次等于 initial(如果提供了 initial 的话)。
- item — 当前的数组元素。
- index — 当前索引。
- arr — 数组本身。
我们可以如下实现:
<code>const reduce = (arr, reduceCallback, initialValue) => { if (!Array.isArray(arr)) { return; } let val = initialValue || 0; for (let i = 0, len = arr.length; i < len; i++) { val = reduceCallback(val, arr[i]); } return val; }/<code>
我们首先检查 arr 是否是数组,然后我们遍历数组,使用 reduceCallback 组合 val 和 arr[i] 并返回新值并将其分配给 val。
循环完成后,我们返回 val。