无法理解这段代码。 (使用reduce写map)

时间:2021-05-21 06:04:59

标签: javascript arrays

我正在通过 MDN 文档 (Link) 阅读有关 javascript reduce 函数的信息。但是我看不懂里面的一段代码。

这是代码 (Link):

if (!Array.prototype.mapUsingReduce) {
  Array.prototype.mapUsingReduce = function(callback, initialValue) {
    return this.reduce(function(mappedArray, currentValue, index, array) {
      mappedArray[index] = callback.call(initialValue, currentValue, index, array)
      return mappedArray
    }, [])
  }
}

[1, 2, , 3].mapUsingReduce(
  (currentValue, index, array) => currentValue + index + array.length
)

我的主要问题是: 在上面的代码中,initialValue 参数的用途是什么?即使 this 工作正常,为什么它使用 initialValue 作为 call 调用回调(因为 this 的第一个参数应该是 callback(currentValue, index, array))。另外,是否需要 if 语句 if (!Array.prototype.mapUsingReduce)

2 个答案:

答案 0 :(得分:1)

大多数 Array.prototype 方法都带有一个可选的附加参数以及名为 thisArg 的回调函数。这是执行回调时用作 this 的值。 initialValue 是一个错误的参数名称,尤其是在 reduce 的上下文中。可能会混淆 reduce

initialValue parameter

在您的情况下,这无关紧要,因为您使用箭头函数作为回调。无法设置 this 值。如果您有一个普通的 function(){},则可以使用其中的 this

在第一个示例中,Set 对象用作 thisArg。在回调中,根据添加 currentValueSet 的大小是否保持不变,检查 currentValue 是否重复。

第二个示例使用带有 sum 的对象来跟踪数组的累积总和。

Array.prototype.mapUsingReduce = function(callback, thisArg) {
  return this.reduce(function(mappedArray, currentValue, index, array) {
    mappedArray[index] = callback.call(thisArg, currentValue, index, array)
    return mappedArray
  }, [])
}

const repeatStatus = [1, 2, 2, 3].mapUsingReduce(function(currentValue) {
  return this.size === this.add(currentValue).size ? 'duplicate' : 'unique'
}, new Set()) // <-- this object is the "thisArg"

console.log(...repeatStatus)

const cumulativeSum = [1, 2, 3, 4, 5].mapUsingReduce(function(currentValue) {
  return this.sum += currentValue
}, { sum: 0 })

console.log(...cumulativeSum)

条件 if (!Array.prototype.mapUsingReduce) 用于确保该方法只创建一次而不会一次又一次地被覆盖。

答案 1 :(得分:0)

该示例应将 initialValue 替换为 thisArg(或 _this、that..)。命名错误。

使用 call() 可以在回调中使用 this 上下文。这不是必需的。

此外,使用 if (!Array.prototype.mapUsingReduce) 您可以安全地执行两次上述代码。这也不是必需的。