有人可以逐步分解此功能并向我解释它在做什么吗?

Can someone please breakdown this function step by step and explain me what it is doing?

adjacentElementsProduct是一个以数组为输入的函数,我们需要找到和return所有相邻元素中乘积较大的相邻元素。

function adjacentElementsProduct(arr) {
  return Math.max(...arr.slice(1).map((x, i) => [x * arr[i]]))
}

所以:

  1. arr.slice(1) returns 除了第一个数组中的所有元素
  2. .map((x,i)=>[x*arr[i]]) 将创建一个数组,其中包含回调 return 和回调 return 当前元素与 [=13 的乘积的所有内容=] 因为在第 1 步我们已经取出第一个,arr[i] 将是前一个(所以会像 [[first number * second], [second * third], [third * fourth], ...]
  3. ...result 是扩展运算符,它将做的是将数组的第一个元素 result 作为第一个参数传递给 Math.max,第二个元素作为第二个参数。 ..
  4. Math.max(...result) 将只是 return 作为参数传递的元素的最大元素

最后:

function adjacentElementsProduct(arr) {
  let res = arr.slice(1); // every element except first
  res = res.map((x,i)=>x*arr[i]) // array like [[first number of  of arr * third number of arr], [third * fourth], ...]
  return Math.max(...res) // max value of res
}

函数执行如下-

解释-

  • 它首先使用slice(1)创建了一个原始数组的副本(阅读slice()),基本上可以理解为从原始数组创建新数组的函数删除第一个元素。

  • 然后,函数映射到新创建的数组。在这里,地图在回调函数中采用两个参数

    1. x - 元素的
    2. i - 元素的索引
  • 这里发生了重要的事情:请注意,这里的 map 是 return 一个数组,其元素是x(这是我们新创建的数组迭代下的当前元素)和 arr[i](这是我们原始数组中索引 i 处的元素)。

    因此,本质上我们在 map() 内的每个循环中 乘以相邻元素 ,因为我们在创建复制数组时删除了第一个元素。

  • 现在,这个 map(),正如我们所知,将 return 一个元素数组,这些元素不过是 x 的乘法和arr[i] 新创建的数组 的每个元素 x。如前所述,它只是所有相邻元素的乘法数组。该数组使用 spread operator syntax (...) and then passed to Math.max() 展开为单独的参数,这将 return 相邻乘法结果数组中所有元素的最大值。


示范-

例如假设我们原来的数组是-

[3,4,8,2,1]
  1. 现在,将要发生的第一件事是创建数组的新副本,并删除第一个元素。所以,newArr = [4,8,2,1]

  2. 接下来,我们映射这个数组。 map() 回调与两个参数一起使用,第一个是值,第二个是当前所在的索引。所以,我们只是映射整个 newArr,然后 returning xarr[i] 的乘积。所以,它发生为 -

    • x = 4i = 0 - 在这里,我们将 return x*arr[i] = 4*arr[0] = 4*3 = 12.

    • x = 8i = 1 - 我们再次 return x*arr[i] = 8*4 = 32.

    • x = 2i = 2 - 我们再次 return x*arr[i] = 2*8 = 16.

    • x = 1i = 3 - 我们再次 return x*arr[i] = 1*2 = 2.

  3. 请注意上面函数所做的只是计算原始数组中所有相邻元素的乘积。

  4. 现在,map() return 是我们计算出的所有这些值的数组。该数组是 - [12,32,16,2]。该数组被拆分为离散参数并传递给 Math.max() 函数,该函数将 return 所有这些的最大值。

  5. 我们得到的答案是 Math.max(...[12,32,16,2]) = Math.max(12,32,16,2) = 32


const myArr = [3,4,8,2,1];

function adjacentElementsProduct(arr) {
  return Math.max(...arr.slice(1).map((x, i) => [x * arr[i]]))
  // 1. Creates new array - [4,8,2,1] using arr.slice(1)
  // 2. uses map over array to iterate over all elements of newly created array
  // 3. map returns an array which is array containing product of adjacent element of original array
  // 4. The array will be expanded into arguments using spread operator
  // 5. Math.max will return the maximum of all these arguments (which are just the multiplication of all adjacent elements of our original array)
}

console.log(adjacentElementsProduct(myArr))


希望这能解决问题。