在工做面試和編碼測試中,反轉具備特定限制的數組是最多見的挑戰之一。面試
本教程將向您展現在JavaScript中使用和不使用 reverse
方法來反轉數組的五種方法,以及能夠使用的代碼段。數組
當須要在JavaScript中反轉數組時,能夠使用 reverse
方法,該方法將最後一個元素放在第一位,而第一個元素放在最後:瀏覽器
let numbers = [1, 2, 3, 4, 5]; let reversedNumbers = numbers.reverse(); console.log(reversedNumbers); // [5, 4, 3, 2, 1]
可是請記住,reverse
方法也會修改原始數組:函數
let numbers = [1, 2, 3, 4, 5]; let reversedNumbers = numbers.reverse(); console.log(reversedNumbers); // [5, 4, 3, 2, 1] console.log(numbers); // [5, 4, 3, 2, 1]
一些編碼挑戰可能但願您保留原始數組,所以讓咱們看一下如何在不更改原始數組的狀況下反轉數組。測試
你能夠結合使用擴展運算符(Spread)和 reverse
方法來反轉數組,而無需更改原始數組。編碼
首先,經過用方括號 []
括住spread語法,將spread運算符返回的元素放入新數組中:spa
[...numbers]
而後,你在數組上調用 reverse
方法。這樣,將在新數組而不是原始數組上執行 reverse
方法:code
let numbers = [1, 2, 3, 4, 5]; let reversedNumbers = [...numbers].reverse(); console.log(reversedNumbers); // [5, 4, 3, 2, 1] console.log(numbers); // [1, 2, 3, 4, 5]
注意:spread
方法是ES6語法,當你須要支持較舊的瀏覽器或要使用ES5語法時,能夠結合使用slice
和reverse
方法。讓咱們如今來看。
slice
方法用於將所選元素做爲新數組返回,當你調用不帶任何參數的方法時,它將返回一個與原始數組相同的新數組(從第一個元素到最後一個元素)。blog
接下來,你在新返回的數組上調用 reverse
方法,這就是爲何原始數組不反轉的緣由:教程
let numbers = [1, 2, 3, 4, 5]; let reversedNumbers = numbers.slice().reverse(); console.log(reversedNumbers); // [5, 4, 3, 2, 1] console.log(numbers); // [1, 2, 3, 4, 5]
有時面試會挑戰你對數組進行逆向操做,而不採用 reverse
方法。沒問題!你能夠使用 for
循環和數組 push
方法的組合,就像下面的例子。
let numbers = [1, 2, 3, 4, 5]; let reversedNumbers = []; for(let i = numbers.length -1; i >= 0; i--) { reversedNumbers.push(numbers[i]); } console.log(reversedNumbers);
最後,假設你的任務是編寫本身的反轉函數,該函數須要在不建立副本的狀況下反轉數組。乍一看,這彷佛很複雜,可是不用擔憂,由於它實際上很簡單。
在這裏你須要作的是交換數組的第一個和最後一個元素,而後交換第二個和倒數第二個元素,依此類推,直到交換了全部元素。
讓咱們編寫一個函數來作到這一點。
編寫函數 customReverse
,並使用 array.length - 1
做爲變量,同時存儲第一個索引爲 0
和最後一個索引。
function customReverse(originalArray) { let leftIndex = 0; let rightIndex = originalArray.length - 1; }
接下來,建立一個 while
循環,只要 leftIndex
小於 rightIndex
,它就會運行。
在此循環內,交換 leftIndex
和 rightIndex
的值,你能夠將值之一臨時存儲在臨時變量中:
while (leftIndex < rightIndex) { // 交換元素 let temp = originalArray[leftIndex]; originalArray[leftIndex] = originalArray[rightIndex]; originalArray[rightIndex] = temp; }
最後,將 leftIndex
向上移動,將 rightIndex
向下移動,當 while
循環重複時,它將交換倒數第二個元素,依此類推:
function customReverse(originalArray) { let leftIndex = 0; let rightIndex = originalArray.length - 1; while (leftIndex < rightIndex) { // 用temp變量交換元素 let temp = originalArray[leftIndex]; originalArray[leftIndex] = originalArray[rightIndex]; originalArray[rightIndex] = temp; // 將索引移到中間 leftIndex++; rightIndex--; } }
當沒有其餘要反轉的元素時,循環將當即中止。對於奇數的數組 leftIndex
和 rightIndex
的值會相等,因此不用再交換。對於偶數的數組 leftIndex
將大於 rightIndex
。
你能夠測試該功能以查看其是否正常工做,以下所示:
let myArray = [1, 2, 3, 4, 5]; customReverse(myArray); console.log(myArray); // output is [5, 4, 3, 2, 1]