【问题标题】:Need help fixing the output of this Higher Order Function.需要帮助修复此高阶函数的输出。
【发布时间】:2018-07-08 05:31:13
【问题描述】:
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);
    }
});

我试图让“fizzbuzz”出现在第 15 个元素上。我不确定要改变什么来解决这个问题。任何帮助将不胜感激。

【问题讨论】:

  • 首先检查% 15,而不是最后一个
  • 对于任何满足n % 15 = 0 的n,n % 5 == 0n % 3 == 0 也是如此,因为5 和3 是15 的因数。

标签: javascript higher-order-functions fizzbuzz


【解决方案1】:

这不是您真正要求的,所以请看它的价值。但是由于您正在查看高阶函数,这通常是函数式样式的一个特征,您可能会考虑在此处采用函数式方法。

例如,您不需要所有循环和if/thens。您的each 函数与array.map 几乎相同。而您的ifs 正在针对一组值进行测试,因此您可以使用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)
        
})

这是一种不同的风格,需要一些时间来适应(而且并不总是更快),但它的噪音更小,并且非常适合其他高阶函数。

【讨论】:

  • reduce 而不是 join,有点过度设计了。
  • 我很欣赏@NinaScholz 的评论,但我无法看到如何在这里使用 join 替换 reduce。
  • `${val}: ` + words.filter(w =&gt; !(val % w.n)).join('');
  • @NinaScholz words.filter() 返回一个对象数组而不是字符串。
  • 然后为这些值添加一个映射。
【解决方案2】:

正如其他人在 cmets 中指出的那样,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);
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多