Обратный массив в Javascript без изменения исходного массива
Array.prototype.reverse
содержимое массива на месте (с мутацией)...
Существует ли такая же простая стратегия для обращения массива без изменения содержимого исходного массива (без мутации)?
Ответы
Ответ 1
Вы можете использовать slice(), чтобы сделать копию, а затем перевернуть() ее
var newarray = array.slice().reverse();
var array = ['a', 'b', 'c', 'd', 'e'];
var newarray = array.slice().reverse();
console.log('a', array);
console.log('na', newarray);
Ответ 2
В ES6:
const newArray = [...array].reverse()
Ответ 3
Еще один вариант ES6:
Мы также можем использовать .reduceRight()
для создания обращенного массива без его реверсирования.
let A = ['a', 'b', 'c', 'd', 'e', 'f'];
let B = A.reduceRight((a, c) => (a.push(c), a), []);
console.log(B);
Ответ 4
Альтернатива 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]), []);
Ответ 5
ES6:
const reverseArr = [1,2,3,4].sort(()=>1)
Ответ 6
Существует несколько способов реверсирования массива без изменения. Двое из них
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
Ответ 7
Попробуйте это рекурсивное решение:
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!