Sah*_*ndy 2 javascript for-loop functional-programming
如何使用函数循环语句(map,forEach,reduce)而不是for循环来检查数组中是否存在数组中任何两个元素的总和.
例如,像这样的数组
[1, 2, 9, 4, 3] // would return true as 1 + 2 = 3
[2,7,12,6,8,20] // true as 2 + 6 = 8 which is enough to make it true
[1, 2, 4, 9] //would return false
Run Code Online (Sandbox Code Playgroud)
我可以通过for循环来做到这一点:
const checkSumExist = arr => {
for(let i = 0; i < arr.length; i++) {
for(let j = i + 1; j < arr.length; j++) {
if(arr.includes(arr[i] + arr[j])) return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
那么在这种情况下是否有使用函数循环语句而不是嵌套for循环的解决方案???
简化的实施 -
const main = (xs = []) =>
xs .some ((n, i) =>
xs .some ((m, j) =>
i < j && xs .includes (n + m)
)
)
console.log
( main ([ 1, 2, 4, 9, 4, 3 ]) // true
, main ([ 2, 7, 12, 6, 8, 20 ]) // true
, main ([ 1, 2, 4, 9 ]) // false
)Run Code Online (Sandbox Code Playgroud)
这种优化使用Set 提高速度O(1) -
const main = (xs = [], s = new Set (xs)) =>
xs .some ((n, i) =>
xs .some ((m, j) =>
i < j && s .has (n + m)
)
)
console.log
( main ([ 1, 2, 4, 9, 4, 3 ]) // true
, main ([ 2, 7, 12, 6, 8, 20 ]) // true
, main ([ 1, 2, 4, 9 ]) // false
)Run Code Online (Sandbox Code Playgroud)
请记住,只在必要时进行优化