2017-07-04 59 views
-1

我试图了解以下解决方案,以找到任何给定数组中的最大相邻产品。查找阵列中最大的相邻产品(JavaScript)

实例:JS

For inputArray = [3, 6, -2, -5, 7, 3], the output should be 
adjacentElementsProduct(inputArray) = 21. 

7 and 3 produce the largest product. 

可能的解决方案:

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

我有一个很难理解两件事情:

  1. 什么做的三个点正好做,这是如何传递给函数的?有没有什么方法可以用更容易理解的方式写出来?我知道这是ES6中的某种“传播”功能,但仍然不完全理解。

  2. 为什么我们插入“1”作为参数切片?我的第一个选择是输入“0”,因为我们想从头开始,然后遍历所有内容,看看哪个相邻产品是最大的。

我会很感激任何建议,链接和解释。

谢谢。

干杯!

+1

1 - 阅读波及文档,或transpile到ES5,看看它做什么[这里transpiled](http://babeljs.io/repl/#?babili=false&evaluate=true&lineWrap=假预置= ENV和目标=浏览器= BUILTINS =假调试=假实验值=真松=假规格=真code_lz = GYVwdgxgLglg9mABAQwCYCtkQKZigUQBtsBbXKAZwAUAnOVEaACmRpoEpEBvAKEURrYoIGkgCyyKAAsAdCWQAPJjJWsaMioRg4mARnZzkAByZMFAGhjsAvAD4A2goBUa-zAC679ux4BfIA),2 - 因为* N *数组中的项目,要检查* N - –

回答

0

1.这三个点到底做了什么?它是如何传递给函数的?有没有什么方法可以用更容易理解的方式写出来?我知道这是ES6中的某种“传播”功能,但仍然不完全理解。

Math#max需要一个数字列表作为参数,map生成一个数组。 spread syntax用于将要扩展的数组转换为参数列表。

const arr = [1, 2, 3]; 
 

 
console.log('max on array', Math.max(arr)); 
 

 
console.log('max on list of parameters', Math.max(...arr));

在这种情况下,你可以使用Function#apply到数组转换为参数列表。然而,我发现它不太可读。

const arr = [1, 2, 3]; 
 

 
console.log(Math.max.apply(Math, arr));

2.为什么我们插入 “1” 作为参数传递给分得一杯羹?我的第一个选择是输入“0”,因为我们想从头开始,然后遍历所有内容,看看哪个相邻产品是最大的。

让我们分解2个数组的迭代次序。

[3, 6, -2, -5, 7, 3] // inputArray 
[6, -2, -5, 7, 3] // inputArray.slice(1) 

现在上的inputArray.slice(1)每次迭代:

x: 6, i = 0, arr[0] = 3 
x: -2, i = 1, arr[1] = 6 
x: -5, i = 2, arr[2] = -2 

由于inputArray.slice(1)阵列从inputArray的第二元件开始,索引(i)指向inputArray的第一元件。结果是两个相邻数字的产品阵列。

+0

谢谢你这么多1个*产品为了彻底的解释! – ErnieandBert

+0

欢迎:)不要忘记关注链接,以获得更多关于如何传播和应用工作的信息。 –

0

您可以简单地做如下操作;

function getNeigboringMaxProduct([x,...xs], r = -Infinity){ 
 
    var p = x * xs[0]; 
 
    return xs.length ? getNeigboringMaxProduct(xs, p > r ? p : r) 
 
        : r; 
 
} 
 

 
var arr = [3, 6, -2, -5, 7, 3], 
 
    res = getNeigboringMaxProduct(arr); 
 
console.log(res);