跳至主要內容

2804. 数组原型的 forEach 方法 🔒


2804. 数组原型的 forEach 方法 🔒

🟢   🔗 力扣open in new window LeetCodeopen in new window

题目

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 array
  • context is a valid JSON object
  • fn is a function
  • 0 <= 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()

  1. Array.prototype 上定义 forEach,使其可以在任何数组上使用。
  2. 遍历数组的每个元素,调用 callback.call(context, value, index, array),以确保 callbackcontext 上下文中执行。
  3. callback 接收三个参数:value(当前元素)、index(当前索引)和 array(数组本身)。
  4. 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);
	}
};