需要帮助修复此高阶函数的输出。
Need help fixing the output of this Higher Order Function.
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 个元素上。我不确定要更改什么来解决此问题。任何帮助将不胜感激。
正如其他人在评论中指出的那样,3
和 5
都是 15
的因素,因此您必须将 (val%15)
放在第一位,否则控制将永远无法达到那句话。
前任。在第 15 个元素上,(val%3)===0
将变为真,并且只会记录 " 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);
}
});
这不是你真正要求的,所以物有所值。但是由于您正在查看高阶函数,这通常是函数式样式的一个特征,您可能会考虑在此处采用函数式方法。
例如,您不需要所有循环和 if/then
s。您的 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)
})
这是一种不同的风格,需要一些时间来适应(而且它并不总是更快),但它的噪音更小并且非常适合其他高阶函数。
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 个元素上。我不确定要更改什么来解决此问题。任何帮助将不胜感激。
正如其他人在评论中指出的那样,3
和 5
都是 15
的因素,因此您必须将 (val%15)
放在第一位,否则控制将永远无法达到那句话。
前任。在第 15 个元素上,(val%3)===0
将变为真,并且只会记录 " 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);
}
});
这不是你真正要求的,所以物有所值。但是由于您正在查看高阶函数,这通常是函数式样式的一个特征,您可能会考虑在此处采用函数式方法。
例如,您不需要所有循环和 if/then
s。您的 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)
})
这是一种不同的风格,需要一些时间来适应(而且它并不总是更快),但它的噪音更小并且非常适合其他高阶函数。