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

时间:2018-04-04 09:01:37

标签: javascript ecmascript-6

这是我的代码!!!

如何替换loop =>使用map(),filter()或reduce()

等方法

算法



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]));
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:2)

您可以Gauss sum formula使用triangular number,其中1n的所有数字都与n * (n + 1) / 2类似。然后你需要减去之前找到的所有1 ... n - 1

 +---- 10 ---+   +------- 45 --------+
 |           |   |                   |

 1   2   3   4   5   6   7   8   9  10

 |               |                   
 +------ 15 -----+

 |                                   |
 +---------------- 55 ---------------+

&#13;
&#13;
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]));
&#13;
&#13;
&#13;

使用reduce来创建临时数组。

&#13;
&#13;
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]));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

如果您愿意,可以使用Array.apply()map(),然后使用reduce()

&#13;
&#13;
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]));
&#13;
&#13;
&#13;