簡體   English   中英

將第一個元素移動到數組末尾的最快方法

[英]Fastest way to move first element to the end of an Array

我想知道 JavaScript 中將元素從Array的開頭移動到結尾的最快方法是什么。 例如,如果我們有

[8,1,2,3,4,5,6,7]

我們想要: [1,2,3,4,5,6,7,8]

我想將第一個元素移到最后。 我正在考慮將元素 0 與元素 1 切換,然后將元素 1 與元素 2 切換,依此類推,直到 8 位於和(基本上是冒泡排序的工作原理)。 我想知道是否有更快的方法來結束第一個元素。

我將使用小數組(大約 10 個元素),我想避免shift()因為它很慢。

這就是我現在在 chrome 上的內容,它比普通的 shift+push 快 45%: http : //jsperf.com/shift-myfunc

數組中將包含用於游戲的對象。

var ary = [8,1,2,3,4,5,6,7];
ary.push(ary.shift());  // results in [1, 2, 3, 4, 5, 6, 7, 8] 

jsFiddle 示例

 var ary = [8,1,2,3,4,5,6,7]; console.log("Before: " + ary); ary.push(ary.shift()); // results in [1, 2, 3, 4, 5, 6, 7, 8] console.log("After: " + ary);

使用shiftpush

var a = ["a","b","c"];
var b = a.shift();
a.push(b);

var b = a.shift();
a[a.length] = b;

根據更新的問題編輯

什么是最快的? 真的取決於數組的內容和瀏覽器/版本!

現在刪除第一個索引的方法是什么?

  • shift()
  • splice()
  • slice()

現在有什么方法可以添加到最后一個索引?

  • push()
  • array[array.length]
  • concat() - 甚至不打算嘗試

其他方式

  • for 循環 - 創建新數組 [在大數組上會很糟糕]

JSPerf:

http://jsperf.com/test-swapping-of-first-to-last


什么才是最快的?

最快的實際上取決於您對陣列的處理方式。 如果您只是使用第一個索引,那么讓您的代碼讀取索引而不是移動值將是最快的。 如果您正在使用所有索引,則不僅僅是循環和通過,當您到達最后時從零開始。 基本計數器。

這是一個甜蜜的 ES6 版本

let arr = [1,2,3,4,5,6]

const [first, ...rest] = arr;
arr = [...rest,first]

使用 splice 獲取第一個元素

var first = array.splice(0,1);

然后推動使如果最后。

既然splice方法的返回值是一個數組,就不得不說

array.push(first[0]);

這里的工作示例: JSFIDDLE

以防萬一你想把任何元素放在最后:

var ary = [8,1,2,3,4,5,6,7];
ary.push(ary.splice(position, 1)[0]);

對於position只需將其包裝在 forEach 中即可。

var a = [1,2,3,4,5,6,7,8];
var b= a[7];
var c = a.slice(1, 8);
c.push(b);

編輯:最好只是轉移,就像 epascarello 在他的回答中所做的那樣。

使用 ES20...

const newArr = [
   ...arr.slice(1),
   arr[0]
];

還有一種味道

var arr = [0, 1, 2];
arr = arr.concat(arr.shift())

concat 不僅可以添加一個元素,還可以在末尾或開頭添加另一個數組

更新將元素從一個極端移動到另一個極端的數組:

const array = ['First', 'Second', 'Third', 'Fourth'];

const next = [...array]
next.push(next.shift())
console.log(next); // [ 'Second', 'Third', 'Fourth', 'First' ]

const prev = [...array]
prev.unshift(prev.pop())
console.log(prev); // [ 'Fourth', 'First', 'Second', 'Third' ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM