2017-07-04 61 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);