有人可以逐步分解此功能并向我解释它在做什么吗?
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]]))
}
所以:
arr.slice(1)
returns 除了第一个数组中的所有元素
.map((x,i)=>[x*arr[i]])
将创建一个数组,其中包含回调 return 和回调 return 当前元素与 [=13 的乘积的所有内容=] 因为在第 1 步我们已经取出第一个,arr[i]
将是前一个(所以会像 [[first number * second], [second * third], [third * fourth], ...]
)
...result
是扩展运算符,它将做的是将数组的第一个元素 result
作为第一个参数传递给 Math.max
,第二个元素作为第二个参数。 ..
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()
),基本上可以理解为从原始数组创建新数组的函数删除第一个元素。
然后,函数映射到新创建的数组。在这里,地图在回调函数中采用两个参数
x
- 元素的值和
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]
现在,将要发生的第一件事是创建数组的新副本,并删除第一个元素。所以,newArr = [4,8,2,1]
接下来,我们映射这个数组。 map()
回调与两个参数一起使用,第一个是值,第二个是当前所在的索引。所以,我们只是映射整个 newArr
,然后 returning x
和 arr[i]
的乘积。所以,它发生为 -
x = 4
和 i = 0
- 在这里,我们将 return x*arr[i]
= 4*arr[0]
= 4*3
= 12
.
x = 8
和 i = 1
- 我们再次 return x*arr[i]
= 8*4
= 32
.
x = 2
和 i = 2
- 我们再次 return x*arr[i]
= 2*8
= 16
.
x = 1
和 i = 3
- 我们再次 return x*arr[i]
= 1*2
= 2
.
请注意上面函数所做的只是计算原始数组中所有相邻元素的乘积。
现在,map()
return 是我们计算出的所有这些值的数组。该数组是 - [12,32,16,2]
。该数组被拆分为离散参数并传递给 Math.max()
函数,该函数将 return 所有这些的最大值。
我们得到的答案是 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))
希望这能解决问题。
adjacentElementsProduct
是一个以数组为输入的函数,我们需要找到和return所有相邻元素中乘积较大的相邻元素。
function adjacentElementsProduct(arr) {
return Math.max(...arr.slice(1).map((x, i) => [x * arr[i]]))
}
所以:
arr.slice(1)
returns 除了第一个数组中的所有元素.map((x,i)=>[x*arr[i]])
将创建一个数组,其中包含回调 return 和回调 return 当前元素与 [=13 的乘积的所有内容=] 因为在第 1 步我们已经取出第一个,arr[i]
将是前一个(所以会像[[first number * second], [second * third], [third * fourth], ...]
)...result
是扩展运算符,它将做的是将数组的第一个元素result
作为第一个参数传递给Math.max
,第二个元素作为第二个参数。 ..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()
),基本上可以理解为从原始数组创建新数组的函数删除第一个元素。然后,函数映射到新创建的数组。在这里,地图在回调函数中采用两个参数
x
- 元素的值和i
- 元素的索引。
这里发生了重要的事情:请注意,这里的 map 是 return 一个数组,其元素是
x
(这是我们新创建的数组迭代下的当前元素)和arr[i]
(这是我们原始数组中索引i
处的元素)。因此,本质上我们在
map()
内的每个循环中 乘以相邻元素 ,因为我们在创建复制数组时删除了第一个元素。现在,这个
map()
,正如我们所知,将 return 一个元素数组,这些元素不过是x
的乘法和arr[i]
新创建的数组 的每个元素x
。如前所述,它只是所有相邻元素的乘法数组。该数组使用 spread operator syntax (...
) and then passed toMath.max()
展开为单独的参数,这将 return 相邻乘法结果数组中所有元素的最大值。
示范-
例如假设我们原来的数组是-
[3,4,8,2,1]
现在,将要发生的第一件事是创建数组的新副本,并删除第一个元素。所以,
newArr = [4,8,2,1]
接下来,我们映射这个数组。
map()
回调与两个参数一起使用,第一个是值,第二个是当前所在的索引。所以,我们只是映射整个newArr
,然后 returningx
和arr[i]
的乘积。所以,它发生为 -x = 4
和i = 0
- 在这里,我们将 returnx*arr[i]
=4*arr[0]
=4*3
=12
.x = 8
和i = 1
- 我们再次 returnx*arr[i]
=8*4
=32
.x = 2
和i = 2
- 我们再次 returnx*arr[i]
=2*8
=16
.x = 1
和i = 3
- 我们再次 returnx*arr[i]
=1*2
=2
.
请注意上面函数所做的只是计算原始数组中所有相邻元素的乘积。
现在,
map()
return 是我们计算出的所有这些值的数组。该数组是 -[12,32,16,2]
。该数组被拆分为离散参数并传递给Math.max()
函数,该函数将 return 所有这些的最大值。我们得到的答案是
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))
希望这能解决问题。