如何使用 map()、filter() 或 reduce() 等方法替换 for loop =>



这是我的代码!

如何使用map((,filter((或yred((

之类的方法替换loop =>

算法

const sumAll = (arr) => {
	let sum = 0
    if (arr[0] > arr[1]) [arr[0], arr[1]] = [arr[1], arr[0]]
  
  	for( let i = arr[0]; i <= arr[1] ; i ++) sum += i
    // replace for loop
  
  	return sum
}
console.log(sumAll([1, 4]));
console.log(sumAll([10, 5]));

您可以使用三角形数字的高斯总和公式,其中从 1n的所有数字都像 n * (n + 1) / 2。然后,您需要减去所有先前发现的1 ... n - 1的总和。

 +---- 10 ---+   +------- 45 --------+
 |           |   |                   |
 1   2   3   4   5   6   7   8   9  10
 |               |                   
 +------ 15 -----+
 |                                   |
 +---------------- 55 ---------------+

function sumAll(array) {
    var min = Math.min(...array),
        max = Math.max(...array);
    return max * (max + 1) / 2 - (min - 1) * min / 2;
}
console.log(sumAll([1, 4]));
console.log(sumAll([10, 5]));

用减少来创建临时数组。

function sumAll(array) {
    var min = Math.min(...array),
        max = Math.max(...array),
        array = Array.from({ length: max - min + 1 }, (_, i) => min + i);
    return array.reduce((a, b) => a + b);
}
console.log(sumAll([1, 4]));
console.log(sumAll([10, 5]));

您可以使用Array.apply()map(),然后使用reduce()

const sumAll = (arr) => {
    if (arr[0] > arr[1]) [arr[0], arr[1]] = [arr[1], arr[0]]
    /*No idea why I am doing it :(*/
  	return Array.apply(null, Array(arr[1] - arr[0] + 1)).map((_, i) => arr[0] + i).reduce((e,s) => e+s,0);
}
console.log(sumAll([1, 4]));
console.log(sumAll([10, 5]));

最新更新