2804. 数组原型的 forEach 方法 🔒
2804. 数组原型的 forEach 方法 🔒
题目
Write your version of method forEach
that enhances all arrays such that you can call the array.forEach(callback, context)
method on any array and it will execute callback
on each element of the array. Method forEach
should not return anything.
callback
accepts the following arguments:
currentValue
- represents the current element being processed in the array. It is the value of the element in the current iteration.index
- represents the index of the current element being processed in the array.array
- represents the array itself, allowing access to the entire array within the callback function.
The context
is the object that should be passed as the function context parameter to the callback
function, ensuring that the this
keyword within the callback
function refers to this context
object.
Try to implement it without using the built-in array methods.
Example 1:
Input:
arr = [1,2,3],
callback = (val, i, arr) => arr[i] = val * 2,
context =
Output: [2,4,6]
Explanation:
arr.forEach(callback, context); console.log(arr); // [2,4,6]
The callback is executed on each element of the array.
Example 2:
Input:
arr = [true, true, false, false],
callback = (val, i, arr) => arr[i] = this,
context =
Output: [{"context":false},{"context":false},{"context":false},{"context":false}]
Explanation:
arr.forEach(callback, context); console.log(arr); // [{"context":false},{"context":false},{"context":false},{"context":false}]
The callback is executed on each element of the array with the right context.
Example 3:
Input:
arr = [true, true, false, false],
callback = (val, i, arr) => arr[i] = !val,
context =
Output: [false,false,true,true]
Constraints:
arr
is a valid JSON arraycontext
is a valid JSON objectfn
is a function0 <= arr.length <= 10^5
题目大意
编写一个数组方法 forEach
,使其可以在任何数组上调用 array.forEach(callback, context)
方法,它将在数组的每个元素上执行回调函数。forEach
方法不应该返回任何内容。
回调函数 callback
接受以下参数:
value
:表示数组中当前正在处理的元素的值。index
:表示数组中当前正在处理的元素的索引。array
:表示数组本身,在回调函数内部可以访问整个数组。
上下文 context
应该是作为函数上下文参数传递给回调函数 callback
的对象,确保回调函数 callback
内部的 this
关键字引用此上下文对象。
尝试在不使用内置数组方法的情况下实现这个方法。
示例 1:
输入:
arr = [1,2,3],
callback = (val, i, arr) => arr[i] = val * 2,
context =
输出:[2,4,6]
解释:
arr.forEach(callback, context); console.log(arr); // [2,4,6]
回调函数在数组的每个元素上执行。
示例 2:
输入:
arr = [true, true, false, false],
callback = (val, i, arr) => arr[i] = this,
context =
输出:[{"context":false},{"context":false},{"context":false},{"context":false}]
解释:
arr.forEach(callback, context); console.log(arr); // [{"context":false},{"context":false},{"context":false},{"context":false}]
回调函数在数组的每个元素上以正确的上下文执行。
示例 3:
输入:
arr = [true, true, false, false],
callback = (val, i, arr) => arr[i] = !val,
context =
输出:[false,false,true,true]
提示:
arr
是一个有效的 JSON 数组context
是一个有效的 JSON 对象fn
是一个函数0 <= arr.length <= 10^5
解题思路
可以通过在 Array.prototype
上定义一个 forEach
方法来实现该功能。为了确保回调函数 callback
在指定的 context
上下文中执行,可以使用 Function.prototype.call()
。
- 在
Array.prototype
上定义forEach
,使其可以在任何数组上使用。 - 遍历数组的每个元素,调用
callback.call(context, value, index, array)
,以确保callback
在context
上下文中执行。 callback
接收三个参数:value
(当前元素)、index
(当前索引)和array
(数组本身)。forEach
不返回任何内容。
代码
/**
* @param {Function} callback
* @param {Object} context
* @return {null}
*/
Array.prototype.forEach = function (callback, context) {
for (let i = 0; i < this.length; i++) {
callback.call(context, this[i], i, this);
}
};