将第一个元素移动到数组末尾的最快方法

Bos*_*wow 45 javascript arrays element

我想知道JavaScript中从一开头Array到结尾移动元素的最快方法是什么.例如,如果我们有

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

我们希望: [1,2,3,4,5,6,7,8]

我想把第一个元素移到最后.我正在考虑用元素1切换元素0,在元素2之后切换元素1,依此类推,直到8处于和(基本上如何起泡).我想知道是否有更快的方法将第一个元素带到最后.

我将使用小阵列(大约10个元素),我想避免,shift()因为它很慢.

这就是我现在在chrome上的速度比普通shift + push快45%:http://jsperf.com/shift-myfunc

数组中将有一些对象用于游戏.

j08*_*691 85

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

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);
Run Code Online (Sandbox Code Playgroud)

  • 对于任何未来的旁路,它的工作原理是使用Shift功能.它删除数组中的第一个项目,然后返回它.换句话说,此代码删除数组中的第一个项目,然后再次添加它 - 使其转到数组的底部. (10认同)
  • 做得很好...我一直在寻找相反的东西,但想到了这个答案,所以经过一些快速研究,这里是执行上述操作的相反方法... ary.unshift(ary.pop()); (4认同)
  • 美好而优雅. (3认同)

epa*_*llo 22

使用shiftpush

var a = ["a","b","c"];
var b = a.shift();
a.push(b);
Run Code Online (Sandbox Code Playgroud)

要么

var b = a.shift();
a[a.length] = b;
Run Code Online (Sandbox Code Playgroud)

编辑基于更新的问题

什么是最快的?真的取决于数组的内容和浏览器/版本!

现在有什么方法可以删除第一个索引?

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

现在添加到最后一个索引的方法是什么?

  • push()
  • array[array.length]
  • concat() - 甚至不去尝试

其他方法

  • for循环 - 制作新数组[在大型阵列上会变得很糟糕]

JSPerf:

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


什么是最快的?

什么是最快的取决于你在使用数组做什么.如果您只是使用第一个索引,那么将代码读取为索引而不是移动值将是最快的.如果您正在使用所有索引,而不仅仅是循环和通过,当您到达结束时,从零开始.基本柜台.

  • 而不是在你的问题中说! (6认同)
  • @ user2815780 - 也许你应该在你的问题中发布你已经尝试过的内容,包括显示快速和慢速的统计数据? (2认同)

Fel*_*eca 7

使用splice获取第一个元素

var first = array.splice(0,1);
Run Code Online (Sandbox Code Playgroud)

然后推,如果是最后一个.

由于splice方法的返回值是一个数组,你必须说

array.push(first[0]);
Run Code Online (Sandbox Code Playgroud)

这里的工作示例:JSFIDDLE


art*_*s90 7

以防万一你想把任何元素放到最后:

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

对于 position刚刚在foreach这个包起来.

  • `ary.push(ary.slice(position,1));`错了,如果位置为0,会导致`[8,1,2,3,4,5,6,7,Array [1]`,或者`[8,1,2,3,4,5,6,7,Array [0]`如果位置是1.我假设你想要'splice`而不是`slice`.因为`slice`不会删除项目,它使用arg列表`start,end`而不是`start,deleteCount`.无论哪种方式,slice/splice都返回一个Array,因此你必须推送arr的第一项,而不是arr本身.我修改了代码:`ary.push(ary.splice(0,1)[0]);` (4认同)
  • 我建议将我的更改作为编辑 (3认同)

Nic*_*las 5

这是一个不错的ES6版本

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

const [first, ...rest] = arr;
arr = [...rest,first]
Run Code Online (Sandbox Code Playgroud)

  • 这真的很甜蜜 (2认同)