最近,我有一个任务要完成,任务如下:
编写一个具有两个参数的函数:
该函数的输出是布尔值。如果在传递的数组中有两个,则输出为“ true” 总和(+)等于第二个参数的元素。在所有其他情况下,输出为“ false”。
所以我用For循环解决了这个问题:
function checkSum(set, number) {
for (let i = 0; i < set.length; i++) {
for (let j = 1; j < set.length; j++) {
if ((set[i] + set[j]) === number) {
return true;
}
}
}
return false;
}
我很好奇,有什么方法可以摆脱for循环并使用map或filter方法。
答案 0 :(得分:1)
您的算法似乎是错误的:它还考虑到元素本身的总和-除了第一个元素。 即
checkSum([1, 5], 10)
-返回true
,但是checkSum([5, 100], 10)
-返回false
。此外,您的算法还没有优化-遍历(几乎)所有元素对。由于必须对数组进行排序,因此可以对算法进行优化,使其仅对相邻元素进行迭代,直到总和大于给定数量为止。
您可以使用“ cool map / filter / find”方法轻松实现算法的非优化,但是使用“旧的好循环”可能会更容易实现优化的版本。
答案 1 :(得分:1)
您可以使用Array#some
来检查数组中的任何元素是否匹配给定条件,并使用Array#find
来找到另一个元素,当添加到当前元素时,该元素可以产生给定的总和。
function checkSum(set, number){
return set.some((x,idx)=>set.find((y,idx2)=>idx!==idx2&&x+y===number));
}
function checkSum(set, number){
return set.some((x,idx)=>set.find((y,idx2)=>idx!==idx2&&x+y===number));
}
console.log(checkSum([2,2,3], 5));