需要帮助修复此高阶函数的输出。

时间:2018-07-08 05:31:14

标签: javascript higher-order-functions fizzbuzz

function each(arr, fn) {
for(var i = 0; i < arr.length; i++){
    fn(arr[i]);
    }
}


each([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20], function(val){
if((val % 3) === 0){
    console.log(val + " fizz");
    } else if((val % 5) === 0) {
    console.log(val + " buzz");
    } else if((val % 15) === 0){
    console.log(val + " fizzbuzz");        
    } else {
    console.log(val);
    }
});

我正在尝试在第15个元素上显示“ fizzbuzz”。我不确定要解决的问题。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

正如其他人在评论中指出的那样,35都是15的因素,因此您必须将(val%15)放在首位,否则控制权将永远无法达到该声明。 例如在第15个元素上,(val%3)===0将变为true,并且仅记录" fizz"

function each(arr, fn) {
for(var i = 0; i < arr.length; i++){
    fn(arr[i]);
    }
}


each([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20], function(val){
    if((val % 15) === 0){
        console.log(val + " fizzbuzz");
    } else if((val % 5) === 0) {
        console.log(val + " buzz");
    } else if((val % 3) === 0){
        console.log(val + " fizz");        
    } else {
        console.log(val);
    }
});

答案 1 :(得分:1)

这并不是您真正要问的,所以请考虑它的价值。但是,由于您正在查看高阶函数(通常是函数样式的功能),因此您可以考虑在此处采用函数方法。

例如,您不需要所有循环和if/then。您的each函数与array.map几乎相同。而且您的if正在针对一组值进行测试,因此您可以只使用filter。另外,执行此操作时,您会注意到不需要检查val % 15,因为您已经在检查3和5:

function each(arr, fn) { arr.map(fn) } // this is a bit redundanct but I left it to show why
          
each([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20], function(val){
    let words = [
        {n: 3, text: 'fizz'},
        {n: 5, text: 'buzz'},   
    ]
    // now just filter the words array and use reduce to build your string
    let text = words.filter(w => !(val % w.n))
               .reduce((a, item) => a + item.text  , `${val}: ` )
 
    console.log(text)
        
})

这是另一种风格,需要一些时间来适应(并且并不总是更快),但是它具有更少的噪音并且可以很好地与其他高阶函数配合。