Самый быстрый способ перемещения первого элемента в конец массива
Мне интересно, какой самый быстрый способ в JavaScript перемещать элемент с начала Array
до конца. Например, если мы имеем
[8,1,2,3,4,5,6,7]
И мы хотим: [1,2,3,4,5,6,7,8]
Я хочу переместить первый элемент в конец. Я думал о переключении элемента 0 с элементом 1, после этого переключающего элемента 1 с элементом 2 и так далее до тех пор, пока 8 не будет в и (в основном, как работает bubblesort). Мне было интересно, есть ли более быстрый способ довести первый элемент до конца.
Я буду использовать небольшие массивы (около 10 элементов), и я хочу избежать shift()
, так как это довольно медленно.
Это то, что у меня сейчас на хроме, на 45% быстрее, чем обычный сдвиг + push: http://jsperf.com/shift-myfunc
Массивы будут иметь в них объекты для игры.
Ответы
Ответ 1
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);
Ответ 2
Используйте shift
и push
var a = ["a","b","c"];
var b = a.shift();
a.push(b);
или
var b = a.shift();
a[a.length] = b;
Изменить По обновленному вопросу
Что будет самым быстрым? Действительно зависит от содержимого массива и того, что браузер/версия!
Каковы способы удаления первого индекса?
Каковы способы добавления к последнему индексу?
-
push()
-
array[array.length]
-
concat()
- даже не попытаться
Другие способы
- for loop - сделать новый массив [будет ужасным на больших массивах]
JSPerf:
http://jsperf.com/test-swapping-of-first-to-last
Что действительно самое быстрое?
Что самое быстрое на самом деле зависит от того, что вы делаете с массивом. Если вы просто используете первый индекс, это будет быстрее всего, чтобы ваш код считывал индекс и не менял значения. Если вы используете все индексы, а не только цикл и до конца, и когда вы дойдете до конца, начните с нуля. Основные счетчики.
Ответ 3
На всякий случай вы хотите поместить любой элемент в конец:
var ary = [8,1,2,3,4,5,6,7];
ary.push(ary.splice(position, 1)[0]);
для position
просто оберните это в forEach.
Ответ 4
Используйте соединение, чтобы получить первый элемент
var first = array.splice(0,1);
Затем нажмите, чтобы сделать, если последний.
Поскольку возвращаемое значение метода сращивания является массивом, вы должны сказать
array.push(first[0]);
Рабочий пример здесь: JSFIDDLE
Ответ 5
А вот и сладкая версия ES6
let arr = [1,2,3,4,5,6]
const [first, ...rest] = arr;
arr = [...rest,first]
Ответ 6
var a = [1,2,3,4,5,6,7,8];
var b= a[7];
var c = a.slice(1, 8);
c.push(b);
Изменить: Возможно, лучше просто сдвинуть, например, epascarello в его ответ.
Ответ 7
еще один аромат
var arr = [0, 1, 2];
arr = arr.concat(arr.shift())
concat может добавить не только элемент, но и другой массив в конец или начало.
Ответ 8
Обновление массивов движущихся элементов из одной крайности в другую:
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' ]