# 2635. 转换数组中的每个元素

# 题目

编写一个函数,这个函数接收一个整数数组 arr 和一个映射函数  fn ,通过该映射函数返回一个新的数组。

返回数组的创建语句应为 returnedArray[i] = fn(arr[i], i) 。

请你在不使用内置方法 Array.map 的前提下解决这个问题。

示例 1:

输入:arr = [1,2,3], fn = function plusone(n) { return n + 1; }
输出:[2,3,4]
解释: 
const newArray = map(arr, plusone); // [2,3,4]
此映射函数返回值是将数组中每个元素的值加 1
成功
1
2
3
4
5

示例 2:

输入:arr = [1,2,3], fn = function plusI(n, i) { return n + i; }
输出:[1,3,5]
解释:此映射函数返回值根据输入数组索引增加每个值。
示例 3:

输入:arr = [10,20,30], fn = function constant() { return 42; }
输出:[42,42,42]
解释:此映射函数返回值恒为 42
成功
1
2
3
4
5
6
7
8

提示:

  • 0 <= arr.length <= 1000
  • -109 <= arr[i] <= 109
  • fn 返回一个数

# 答案

/**
 * @param {number[]} arr
 * @param {Function} fn
 * @return {number[]}
 */
var map = function(arr, fn) {
    let newArr = [];
    arr.forEach((item, index) => {
        newArr.push(fn && fn(item, index))
    })
    return newArr;
};
成功
1
2
3
4
5
6
7
8
9
10
11
12

# 思路

这题考验的是如何用其他数组循环方式实现map函数。

  • for-in 循环会遍历对象的所有可枚举属性,而不仅仅是数组元素。这可能包括对象原型链上的属性,这些属性在遍历时不是很有用。每次迭代都会搜索并检查所有可枚举属性,这可能需要更多的时间和资源。

  • forEach 循环专门为遍历数组元素而设计,能够更快地定位每个元素的位置。在每次迭代中,只需要处理数组元素,而不是搜索和检查其他属性。

此外,在使用 for-in 循环时,可能会遇到一些不符合预期的结果。例如,在没有将数组对象设置为非枚举属性时,它将出现在 for-in 循环的遍历中。这意味着某些属性可能会被错误地遍历,导致性能下降。