Array.prototype.reverse
повертає вміст масиву на місце (з мутацією) ...
Чи існує аналогічно проста стратегія повернення масиву без зміни вмісту вихідного масиву (без мутації)?
Array.prototype.reverse
повертає вміст масиву на місце (з мутацією) ...
Чи існує аналогічно проста стратегія повернення масиву без зміни вмісту вихідного масиву (без мутації)?
Відповіді:
Ви можете скористатися фрагментом (), щоб зробити копію, а потім повернути її назад ()
var newarray = array.slice().reverse();
У ES6:
const newArray = [...array].reverse()
[...].reverse
перевагу в дуже простому тестовому випадку. jsperf.com/reverse-vs-slice-reverse/1
.slice
якнайшвидше.
slice
, швидше за все, швидше b / c [...]
- це загальний ітерабельний масив, тому не можна робити так багато припущень. Крім того, цілком ймовірно, що slice
краще оптимізовано виробництво / с, це було вже давно.
Ще один варіант ES6:
Ми також можемо використовувати .reduceRight()
для створення зворотного масиву, фактично не повертаючи його.
let A = ['a', 'b', 'c', 'd', 'e', 'f'];
let B = A.reduceRight((a, c) => (a.push(c), a), []);
console.log(B);
Корисні ресурси:
reduceRight
повільно аф
(a, c) => a.concat([c])
відчуває себе більш ідіоматичним, ніж(a, c) => (a.push(c), a)
Спробуйте це рекурсивне рішення:
const reverse = ([head, ...tail]) =>
tail.length === 0
? [head] // Base case -- cannot reverse a single element.
: [...reverse(tail), head] // Recursive case
reverse([1]); // [1]
reverse([1,2,3]); // [3,2,1]
reverse('hello').join(''); // 'olleh' -- Strings too!
Альтернатива ES6 із використанням .reduce()
та поширенням.
const foo = [1, 2, 3, 4];
const bar = foo.reduce((acc, b) => ([b, ...acc]), []);
В основному, це робиться - створити новий масив із наступним елементом у foo та розповсюдити накопичений масив для кожної ітерації після b.
[]
[1] => [1]
[2, ...[1]] => [2, 1]
[3, ...[2, 1]] => [3, 2, 1]
[4, ...[3, 2, 1]] => [4, 3, 2, 1]
Альтернативно, .reduceRight()
як зазначено вище, але без .push()
мутації.
const baz = foo.reduceRight((acc, b) => ([...acc, b]), []);
Існує кілька способів повернути масив без зміни. Двоє з них є
var array = [1,2,3,4,5,6,7,8,9,10];
// Using Splice
var reverseArray1 = array.splice().reverse(); // Fastest
// Using spread operator
var reverseArray2 = [...array].reverse();
// Using for loop
var reverseArray3 = [];
for(var i = array.length-1; i>=0; i--) {
reverseArray.push(array[i]);
}
Тест на продуктивність http://jsben.ch/guftu
В звичайний Javascript:
function reverseArray(arr, num) {
var newArray = [];
for (let i = num; i <= arr.length - 1; i++) {
newArray.push(arr[i]);
}
return newArray;
}
Реверсування на місці зі змінною свопом для демонстраційних цілей (але вам потрібна копія, якщо ви не хочете мутувати)
const myArr = ["a", "b", "c", "d"];
const copy = [...myArr];
for (let i = 0; i < (copy.length - 1) / 2; i++) {
const lastIndex = copy.length - 1 - i;
[copy[i], copy[lastIndex]] = [copy[lastIndex], copy[i]]
}
es6:
const reverseArr = [1,2,3,4].sort(()=>1)
1
в кінці могло бути щось більше нуля, тому що так працює Array.prototype.sort
зворотний виклик (або так званий compare function
). В принципі ви завжди порівняти 2 числа , і в цьому випадку повертається порівняння завжди позитивні , так він каже завжди перейти до другого номеру перед першою :) це дуже розумний: stackoverflow.com/questions/6567941 / ...
sort()
мутує масив (тобто сортує його на місці), чого ОП хоче уникнути.