0

所以我有这个简单的功能:

function exampleFn (firstArray, secondArray) {
  return firstArray.map((x, y) =>
    Math.abs(x - secondArray[y]))
    .reduce((a, b) => a + b * b) / firstArray.length;
}

功能:

  • 接受两个长度相等的整数数组
  • 将一个数组中每个成员的值与另一个数组中的对应成员的值进行比较
  • 将这两个值之间的绝对值差平方
  • 并返回每个成员对之间的平方绝对值差的平均值。

它适用于以下值:[10, 20, 10, 2], [10, 25, 5, -2] //16.5 == 16.5。也适用于:[-1, 0], [0, -1] //1 == 1。 但它不适用于: [1, 2, 3], [4, 5, 6] //应该为 9,而不是返回 7

为什么会发生这种情况,我该如何解决(我只想在一行中执行此操作,长或短)?我想念 .reduce() 的什么?

  • [3, 3, 3].reduce((a, b) => a + b*b) -----> 当我认为它应该返回 27 时返回 21。
4

1 回答 1

0

让我们逐步介绍您作为问题最后一部分包含的 reduce 示例:

[3, 3, 3].reduce((a, b) => a + b*b) 

reduce 函数被调用两次。

  1. a=3, b=3执行3 + 3 * 3,产生 12
  2. a=12, b=3执行12 + 3 * 3,产生 21

您正在尝试计算平方和。您可以先对每个元素求平方,然后像这样对它们求和:

[3, 3, 3].map(n => n * n)
         .reduce((a, b) => a + b)

这产生 27。

因此,整个函数的解决方案如下所示:

function exampleFn (firstArray, secondArray) {
  return firstArray.map((x, y) => Math.abs(x - secondArray[y]))
                   .map(n => n * n)
                   .reduce((a, b) => a + b) / firstArray.length;
}

console.log(exampleFn([10, 20, 10, 2], [10, 25, 5, -2]) === 16.5)
console.log(exampleFn([-1, 0], [0, -1]) === 1)
console.log(exampleFn([1, 2, 3], [4, 5, 6]) === 9)

于 2020-12-28T20:50:44.400 回答