# 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
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
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
2
3
4
5
6
7
8
9
10
11
12
# 思路
这题考验的是如何用其他数组循环方式实现map函数。
for-in循环会遍历对象的所有可枚举属性,而不仅仅是数组元素。这可能包括对象原型链上的属性,这些属性在遍历时不是很有用。每次迭代都会搜索并检查所有可枚举属性,这可能需要更多的时间和资源。forEach循环专门为遍历数组元素而设计,能够更快地定位每个元素的位置。在每次迭代中,只需要处理数组元素,而不是搜索和检查其他属性。
此外,在使用 for-in 循环时,可能会遇到一些不符合预期的结果。例如,在没有将数组对象设置为非枚举属性时,它将出现在 for-in 循环的遍历中。这意味着某些属性可能会被错误地遍历,导致性能下降。