Given an integer array arr and a mapping function fn, return a new array with a transformation applied to each element.
The returned array should be created such that returnedArray[i] = fn(arr[i], i).
Please solve it without the built-in Array.map method.
給予一個整數陣列 arr 和一個映射函數 fn,回傳一個對每個元素運算轉換的新陣列。 回傳的陣列應該要建立一個新的 returnedArray[i] = fn(arr[i], i)。 請不要使用 Array.map 方法來解決問題。
Example 1:
Input: arr = [1,2,3], fn = function plusone(n) { return n + 1; } Output: [2,3,4]
Example 2:
Input: arr = [1,2,3], fn = function plusI(n, i) { return n + i; } Output: [1,3,5]
Example 3:
Input: arr = [10,20,30], fn = function constant() { return 42; } Output: [42,42,42]
solution:
因題目希望我們不要使用 map() 的方法,同時又希望回傳的是一個新的陣列,
所以這部分我們先宣告一個空陣列叫做 res,接著我們運用 forEach((num, index)) 的方式,
將題目給的 arr 中所有的 element 的數值 num 與位置 index,依序放入 fn(num, index)中做運算,
且同步放入到新的陣列 res 中,最後回傳結果。
Code 1: BigO(n)
var map = function(arr, fn) { const res = [] arr.forEach((num, index) => { res.push(fn(num, index)) }) return res; };
FlowChart:
Example 1
Input: arr = [1,2,3], fn = function plusone(n) { return n + 1; } fn(num) fn(1) 1 + 1 = 2 res.push(2) //res = [2] fn(2) 2 + 1 = 3 res.push(3) //res = [2, 3] fn(3) 3 + 1 = 4 res.push(4) //res = [2, 3, 4]
Example 2
Input: arr = [1,2,3], fn = function plusI(n, i) { return n + i; } fn(num, index) fn(1, 0) 1 + 0 = 1 res.push(1) //res = [1] fn(2, 1) 2 + 1 = 3 res.push(3) //res = [1, 3] fn(3, 2) 3 + 2 = 5 res.push(5) //res = [1, 3, 5]
Example 3
Input: arr = [10,20,30], fn = function constant() { return 42; } fn(num) fn(1) return 42 res.push(42) //res = [42] fn(2) return 42 res.push(42) //res = [42, 42] fn(3) return 42 res.push(42) //res = [42, 42, 42]