使用Map或Filter方法替换循环

时间:2020-07-17 13:41:43

标签: javascript

最近,我有一个任务要完成,任务如下:

编写一个具有两个参数的函数:

  • 首先是一个不减数字的数组
  • 第二个是一个数字

该函数的输出是布尔值。如果在传递的数组中有两个,则输出为“ 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方法。

2 个答案:

答案 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));