回答:
ES6の場合:
const newArray = [...array].reverse()
[...].reverse
は非常に単純なテストケースで優位に立つように見えます。jsperf.com/reverse-vs-slice-reverse/1
.slice
大幅に高速化しています。
slice
しますが、高速になる可能性がありますb / c [...]
は配列への反復可能な汎用であるため、それほど多くの仮定を行うことはできません。またslice
、長い間使用されてきたb / cがより最適化されている可能性があります。
別のES6バリアント:
を使用.reduceRight()
して、実際に反転させずに反転配列を作成することもできます。
let A = ['a', 'b', 'c', 'd', 'e', 'f'];
let B = A.reduceRight((a, c) => (a.push(c), a), []);
console.log(B);
役立つリソース:
reduceRight
is slow af
(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]), []);
変更せずに配列を逆にする方法は複数あります。それらの2つは
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
es6:
const reverseArr = [1,2,3,4].sort(()=>1)
1
では、Array.prototype.sort
コールバック(またはいわゆるcompare function
)が動作する方法であるため、最後にゼロより大きいものになる可能性があります。それは常に最初のものの前で二番目の数字に移動すると言うので、基本的には、常にこのような場合には常に正比較リターンを2つの数字を比較して:)これはとても説明です: stackoverflow.com/questions/6567941/...
sort()
配列を変更します(つまり、その場所で並べ替えます)。これは、OPが避けたいものです。