JavaScript - 使用 reduce 实现 map 函数,将函数作为参数传递时出错

JavaScript - implementing map function with reduce, error when passing function as argument

我正在尝试使用 reduce 在 javascript 中实现映射函数。

function newMap(inputArr, fn) {
    return inputArr.reduce((mapItem, elem) => 
        mapItem = (fn(elem)), [])
}

function plusTwo(num) {
    return num + 2;
}

newMap(arr, plusTwo())

console.log(newMap)

错误输出为:“TypeError: fn is not a function”

所以我的问题是——reduce 函数签名或正在传递的函数抛出错误,我做错了什么?

P.S。 -- 仍在学习 javascript,如果有人可以帮助编辑标题以使其更清晰,我们将不胜感激。

谢谢

您在传递时调用 plusTwo,但您只需在 reduce 回调中调用 plusTwo。在 reduce 回调中,将 fn(elem) 的调用添加到累加器数组中。

function newMap(inputArr, fn) {
    return inputArr.reduce((accum, item) => [...accum, fn(item)], []);
}

function plusTwo(num) {
    return num + 2;
}

const arr = [1, 2, 3];
console.log(newMap(arr, plusTwo));

您传递给 reduce 的回调预计会 return 一些东西。加上其他人的评论,你想传递plusTwo,而不是plusTwo(),这是一个NaNundefined+2的结果):

function newMap(inputArr, fn) {
    return inputArr.reduce((accum, item) => {
        accum.push(fn(item));
        return accum;
    }, []);
}

function plusTwo(num) {
    return num + 2;
}

const arr = [1, 2, 3];
console.log(newMap(arr, plusTwo));

console.log("plusTwo:", plusTwo);
console.log("plusTwo():", plusTwo());

  • mapItem 是对结果数组的引用。您需要将结果值推送给它,而不是在每次迭代中重新分配它,即 mapItem.push(fn(elem))
  • plusTwo 作为函数传入而不是调用它 plusTwo(),这就是您收到 fn is not a function 错误
  • 的原因
  • 打印 newMap 的结果而不是 newMap 本身
function newMap(inputArr, fn) {
  return inputArr.reduce((mapItem, elem) => {
      mapItem.push(fn(elem))
      return mapItem;
  }, [])
}

function plusTwo(num) {
    return num + 2;
}

let result = newMap([1,2,3], plusTwo)

console.log(result)