JavaScript數組反轉教程

在工做面試和編碼測試中,反轉具備特定限制的數組是最多見的挑戰之一。面試

本教程將向您展現在JavaScript中使用和不使用 reverse 方法來反轉數組的五種方法,以及能夠使用的代碼段。數組

如何使用Reverse方法反轉JavaScript中的數組

當須要在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運算符反轉JavaScript中的數組

你能夠結合使用擴展運算符(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語法時,能夠結合使用 slicereverse 方法。讓咱們如今來看。

如何使用Slice和Reverse方法反轉JavaScript中的數組

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方法的狀況下在JavaScript中反轉數組

有時面試會挑戰你對數組進行逆向操做,而不採用 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);

如何用JS編寫本身的反轉函數

最後,假設你的任務是編寫本身的反轉函數,該函數須要在不建立副本的狀況下反轉數組。乍一看,這彷佛很複雜,可是不用擔憂,由於它實際上很簡單。

在這裏你須要作的是交換數組的第一個和最後一個元素,而後交換第二個和倒數第二個元素,依此類推,直到交換了全部元素。

image

讓咱們編寫一個函數來作到這一點。

編寫函數 customReverse,並使用 array.length - 1 做爲變量,同時存儲第一個索引爲 0 和最後一個索引。

function customReverse(originalArray) {
  let leftIndex = 0;
  let rightIndex = originalArray.length - 1;
}

接下來,建立一個 while 循環,只要 leftIndex 小於 rightIndex,它就會運行。

在此循環內,交換 leftIndexrightIndex 的值,你能夠將值之一臨時存儲在臨時變量中:

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--;
  }
}

當沒有其餘要反轉的元素時,循環將當即中止。對於奇數的數組 leftIndexrightIndex 的值會相等,因此不用再交換。對於偶數的數組 leftIndex 將大於 rightIndex

你能夠測試該功能以查看其是否正常工做,以下所示:

let myArray = [1, 2, 3, 4, 5];

customReverse(myArray);

console.log(myArray);

// output is [5, 4, 3, 2, 1]
相關文章
相關標籤/搜索