Array.prototype.reverse
yerinde bir dizinin içeriğini tersine çevirir (mutasyon ile) ...
Orijinal dizinin içeriğini değiştirmeden (mutasyon olmadan) bir diziyi tersine çevirmek için benzer basit bir strateji var mı?
Array.prototype.reverse
yerinde bir dizinin içeriğini tersine çevirir (mutasyon ile) ...
Orijinal dizinin içeriğini değiştirmeden (mutasyon olmadan) bir diziyi tersine çevirmek için benzer basit bir strateji var mı?
Yanıtlar:
Sen kullanabilirsiniz dilim () bir kopyası daha sonra yapmak ) (ters it
var newarray = array.slice().reverse();
ES6'da:
const newArray = [...array].reverse()
[...].reverse
çok basit bir test durumunda bir avantaj sağlıyor. jsperf.com/reverse-vs-slice-reverse/1
.slice
olarak çok daha hızlı hale geliyorum .
slice
daha hızlı olması muhtemeldir b / c [...]
diziye yinelenebilir bir jeneriktir, bu nedenle çok fazla varsayım yapamaz. Ayrıca, muhtemelen slice
daha iyi optimize edilmiş b / c uzun süredir var.
Başka bir ES6 varyantı:
Ayrıca .reduceRight()
tersine çevirmeden tersine çevrilmiş bir dizi oluşturmak için de kullanabiliriz .
let A = ['a', 'b', 'c', 'd', 'e', 'f'];
let B = A.reduceRight((a, c) => (a.push(c), a), []);
console.log(B);
Yararlı Kaynaklar:
reduceRight
yavaş
(a, c) => a.concat([c])
daha deyimsel hissediyor(a, c) => (a.push(c), a)
Bu özyinelemeli çözümü deneyin:
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!
Kullanmak .reduce()
ve yaymak için bir ES6 alternatifi .
const foo = [1, 2, 3, 4];
const bar = foo.reduce((acc, b) => ([b, ...acc]), []);
Temel olarak yaptığı şey, foo'daki sonraki öğeyle yeni bir dizi oluşturmak ve b'den sonra her yineleme için biriken diziyi yaymaktır.
[]
[1] => [1]
[2, ...[1]] => [2, 1]
[3, ...[2, 1]] => [3, 2, 1]
[4, ...[3, 2, 1]] => [4, 3, 2, 1]
Alternatif .reduceRight()
olarak burada yukarıda belirtildiği gibi, ancak .push()
mutasyon olmadan .
const baz = foo.reduceRight((acc, b) => ([...acc, b]), []);
Bir diziyi değiştirmeden tersine çevirmenin birden çok yolu vardır. İkisi
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]);
}
Performans testi http://jsben.ch/guftu
INTO düz Javascript:
function reverseArray(arr, num) {
var newArray = [];
for (let i = num; i <= arr.length - 1; i++) {
newArray.push(arr[i]);
}
return newArray;
}
Yalnızca gösterim amacıyla değişken takas ile yerinde tersine çevirme (ancak değiştirmek istemiyorsanız bir kopyasına ihtiyacınız vardır)
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
, sonunda sıfırdan büyük bir şey olabilirdi, çünkü Array.prototype.sort
geri arama (ya da böyle denir compare function
) böyle çalışır. Temelde her zaman 2 sayıyı karşılaştırırsınız ve bu durumda karşılaştırma her zaman pozitif olur, bu yüzden her zaman
sort()
OP'yi kaçınmak istediği diziyi değiştirir (yani, yerinde sıralar).