Javascript
 Computer >> コンピューター >  >> プログラミング >> Javascript

JavaScriptの.sort()メソッドの問題を修正しました。1つだけではなく2つの配列がソートされます


Array.prototype.sort()関数のプロパティの1つは、インプレース並べ替えアルゴリズムであるということです。つまり、並べ替える配列の新しいコピーを作成せず、余分なスペースを使用せずに配列を並べ替えて、効率を高めます。パフォーマンスが優れていますが、この特性により、厄介な状況が発生する場合があります。

例を挙げてこれを理解しましょう。いくつかの文字列リテラルを含むnames配列があると仮定します。この配列の順序をそのまま維持し、names配列と同じ要素を含むが、アルファベット順にソートされた別の配列が必要です。

私たちはこのようなことをすることができます-

const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj'];
let sortedNames = names;
sortedNames = sortedNames.sort();
console.log(names);
console.log(sortedNames);

ただし、JavaScriptでわかっているように、配列もオブジェクトであり、オブジェクトは値ではなく参照によってコピーされるため、1つの配列を並べ替えると、両方の配列が並べ替えられます。これは明らかに必要ありません。

ソリューション

1。新しい配列の初期化中にslice()を使用する

const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj'];
let sortedNames = names.slice();
sortedNames = sortedNames.sort();
console.log(names);
console.log(sortedNames);

slave()メソッドは、実際には浅いコピーを返し、使用される配列の新しい配列にコピーされます。引数が指定されていない場合は、最初から最後までコピーされます。

このメソッドは、新しい配列の初期化を含み、文字列/数値リテラルの配列でのみ有効であるため、あまり効率的ではありませんが、2番目のメソッドは少し効率的で、オブジェクトの配列でもうまく機能します。

2。 JSON.stringify()/ JSON.parse()を使用する

const names = ['Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj'];
let sortedNames = JSON.parse(JSON.stringify(names));
sortedNames = sortedNames.sort();
console.log(names);
console.log(sortedNames);

配列をJSON文字列に変換し、ある方法で配列に戻すと、コンパイラは参照によってコピーされなくなります。

両方の方法の出力は、コンソールで同じになります-

出力

[ 'Rakesh', 'Mukesh', 'Ram', 'Anshul', 'Dheeraj' ]
[ 'Anshul', 'Dheeraj', 'Mukesh', 'Rakesh', 'Ram' ]

  1. JavaScriptのSort()メソッド

    JavaScriptのsort()メソッドは、配列のソートに使用されます。並べ替えの順序は、アルファベット、数字、昇順、降順のいずれかです。 以下は、sort()メソッドのコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /&

  2. 2つの配列を1つのJavaScriptオブジェクトに変換できますか?

    以下は、2つの配列を1つのJavaScriptオブジェクトに変換するコードです- 例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <style>