Array.prototype.reverse odwraca zawartość tablicy w miejscu (z mutacją) ...
Czy istnieje podobnie prosta strategia odwracania tablicy bez zmiany zawartości oryginalnej tablicy (bez mutacji)?
Array.prototype.reverse odwraca zawartość tablicy w miejscu (z mutacją) ...
Czy istnieje podobnie prosta strategia odwracania tablicy bez zmiany zawartości oryginalnej tablicy (bez mutacji)?
Odpowiedzi:
Można użyć slice () , aby wykonać kopię następnie reverse () go
var newarray = array.slice().reverse();
W ES6:
const newArray = [...array].reverse()
[...].reverseprzewagę w bardzo prostym przypadku testowym. jsperf.com/reverse-vs-slice-reverse/1
.sliceznacznie szybszy.
sliceprawdopodobnie będzie szybszy b / c [...]jest ogólną iterowalną tablicą, więc nie można przyjąć tylu założeń. Jest również prawdopodobne, że slicejest lepiej zoptymalizowany b / c, to już dawno temu.
Kolejny wariant ES6:
Możemy również użyć .reduceRight()do utworzenia odwróconej tablicy bez jej odwracania.
let A = ['a', 'b', 'c', 'd', 'e', 'f'];
let B = A.reduceRight((a, c) => (a.push(c), a), []);
console.log(B);
Przydatne zasoby:
reduceRightjest wolny af
(a, c) => a.concat([c])czuje się bardziej idiomatyczny niż(a, c) => (a.push(c), a)
Wypróbuj to rozwiązanie rekurencyjne:
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!
Alternatywa ES6 przy użyciu .reduce()i rozprzestrzenianiu się.
const foo = [1, 2, 3, 4];
const bar = foo.reduce((acc, b) => ([b, ...acc]), []);
Zasadniczo tworzy nową tablicę z następnym elementem w foo i rozkłada zgromadzoną tablicę dla każdej iteracji po b.
[]
[1] => [1]
[2, ...[1]] => [2, 1]
[3, ...[2, 1]] => [3, 2, 1]
[4, ...[3, 2, 1]] => [4, 3, 2, 1]
Alternatywnie, .reduceRight()jak wspomniano powyżej, ale bez .push()mutacji.
const baz = foo.reduceRight((acc, b) => ([...acc, b]), []);
Istnieje wiele sposobów odwracania tablicy bez modyfikacji. Dwie z nich są
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]);
}
Test wydajności http://jsben.ch/guftu
INTO zwykły JavaScript:
function reverseArray(arr, num) {
var newArray = [];
for (let i = num; i <= arr.length - 1; i++) {
newArray.push(arr[i]);
}
return newArray;
}
Cofanie w miejscu z zamianą zmiennych tylko w celach demonstracyjnych (ale potrzebujesz kopii, jeśli nie chcesz mutować)
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)
1na końcu mogło być coś większego niż zero, ponieważ Array.prototype.sorttak compare functiondziała callback (lub tak zwany ). Zasadniczo zawsze porównujesz 2 liczby, w tym przypadku porównanie zawsze zwraca wartość dodatnią, więc zawsze mówi o przejściu do drugiej liczby przed pierwszą :) To bardzo objaśniające: stackoverflow.com/questions/6567941/…
sort()mutuje tablicę (tzn. sortuje ją na miejscu), czego OP chce uniknąć.