繁体   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