Array.prototype.reverse membalikkan isi array di tempat (dengan mutasi) ...
Apakah ada strategi yang sama sederhana untuk membalikkan array tanpa mengubah isi array asli (tanpa mutasi)?
Array.prototype.reverse membalikkan isi array di tempat (dengan mutasi) ...
Apakah ada strategi yang sama sederhana untuk membalikkan array tanpa mengubah isi array asli (tanpa mutasi)?
Jawaban:
Anda dapat menggunakan slice () untuk membuat salinan kemudian membalikkan () itu
var newarray = array.slice().reverse();
Dalam ES6:
const newArray = [...array].reverse()
[...].reversekeunggulan dalam kasus uji yang sangat sederhana. jsperf.com/reverse-vs-slice-reverse/1
.slicesecara signifikan lebih cepat.
slicekemungkinan lebih cepat b / c [...]adalah generik iterable-to-array sehingga tidak dapat membuat banyak asumsi. Juga, kemungkinan yang slicedioptimalkan lebih baik b / c sudah ada sejak lama.
Varian ES6 lainnya:
Kita juga bisa menggunakan .reduceRight()untuk membuat array terbalik tanpa benar-benar membalikkannya.
let A = ['a', 'b', 'c', 'd', 'e', 'f'];
let B = A.reduceRight((a, c) => (a.push(c), a), []);
console.log(B);
Sumber Daya Berguna:
reduceRightlambat af
(a, c) => a.concat([c])terasa lebih idiomatis daripada(a, c) => (a.push(c), a)
Coba solusi rekursif ini:
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!
Alternatif ES6 menggunakan .reduce()dan menyebarkan.
const foo = [1, 2, 3, 4];
const bar = foo.reduce((acc, b) => ([b, ...acc]), []);
Pada dasarnya yang dilakukannya adalah membuat array baru dengan elemen berikutnya di foo, dan menyebarkan array yang terakumulasi untuk setiap iterasi setelah b.
[]
[1] => [1]
[2, ...[1]] => [2, 1]
[3, ...[2, 1]] => [3, 2, 1]
[4, ...[3, 2, 1]] => [4, 3, 2, 1]
Atau .reduceRight()seperti yang disebutkan di atas di sini, tetapi tanpa .push()mutasi.
const baz = foo.reduceRight((acc, b) => ([...acc, b]), []);
Ada beberapa cara membalikkan array tanpa mengubah. Dua di antaranya
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]);
}
Tes kinerja http://jsben.ch/guftu
MENJADI Javascript biasa:
function reverseArray(arr, num) {
var newArray = [];
for (let i = num; i <= arr.length - 1; i++) {
newArray.push(arr[i]);
}
return newArray;
}
Membalikkan di tempat dengan variabel swap hanya untuk tujuan demonstratif (tetapi Anda memerlukan salinan jika Anda tidak ingin bermutasi)
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)
1pada akhirnya bisa saja lebih besar dari nol, karena itulah cara kerja Array.prototype.sortcallback (atau disebut demikian compare function). Pada dasarnya Anda selalu membandingkan 2 angka dan dalam hal ini pengembalian kembali selalu positif sehingga dikatakan selalu pindah ke angka kedua di depan yang pertama :) ini sangat jelas: stackoverflow.com/questions/6567941/…
sort()bermutasi array (yaitu, mengurutkannya di tempat), yang ingin menghindari OP.