2017-10-11 19 views
2

使用ES6改進我的算法知識(對於ES6我是相當新的)並且想知道是否有任何方法(如果在所有表演者中)避免在我寫的每個數組函數中最大的一個for循環?任何避免for循環的方法? (ES6/JavaScript)

function largestEach(arr) { 
    for(const [i,v] of arr.entries()) 
     arr[i] = v.sort((a,b) => b - a).filter((e,i) => i === 0); 
    return arr.reduce((a,b) => a.concat(b)); 
} 
largestEach([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]); 

控制檯日誌:[5, 27, 39, 1001]這是正確的。

這是概念,所以沒有真正的使用案例我使用它。我不反對循環只是好奇我的更好的選擇是在ES6(或一般的JS)。純粹好奇!

+4

'返回arr.map(V => Math.max(。 ..v));' – 4castle

+0

我想出了和@ 4castle一樣的東西。請注意,如果任何內部數組爲空,您會爲它們得到一個'-Infinity'的結果,這比在這種情況下問題中的函數更好(輸出簡單地跳過任何空數組,返回與輸入不同長度的數組)。 – nnnnnn

+0

@ 4castle所以... ...擴展語法基本上擴展了這個子數組,並只返回最大值...有趣! – simplexity

回答

4

你可以簡單地使用.map()。基本上你for循環是相同的:

arr = arr.map(elem => elem.sort((a, b) => b - a).filter(e,i) => i === 0) 

然而,接下來的事情這就是有趣的是,你不必指定在這種情況下排序功能。我也不會使用.filter(e,i) => i === 0),而是使用.pop()[0]

所以你可以重寫:

arr = arr.map(elem => elen.sort()[0]) 

接下來,您可以使用Math.max,所以你可以重寫你的整個功能:

function largestEach(arr) { 
    return arr.map(e => Math.max(...e)) 
} 
+1

@ some - 沒有[* spread operator *](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator)。 ;-) – RobG

+0

你確實需要一個自定義的排序回調,因爲默認存儲元素lexicographical:'console.log([10,9,20] .sort())''。 –

+0

@ some-Mozilla不會編寫MDN的內容,貢獻者可以做。任何人都可以成爲貢獻者(是的,我是一個,但不是很活躍),只需創建一個帳戶,然後離開你。 '...''是一個[*標點符號*](http://ecma-international.org/ecma-262/8.0/#sec-punctuators),用於擴展和休息語法中,';'用於定義語句,但它不被稱爲「聲明運算符」。 ;-) – RobG

2
function largestEach(arr) { 
    return arr.map(a => a.reduce((a, b) => Math.max(a, b))); 
} 
2
function largestEach(arr) { 
    return arr.map((a)=> Math.max.apply(null, a)) 
} 
+0

這是最快的解決方案 –

+0

@ PanosK.它可能是最快的,但如果數組很大,它也會因堆棧溢出而崩潰。 – some

+0

@some多大? –