web-dev-qa-db-ja.com

各要素の長さに基づいて配列をソートする方法は?

私はこのような配列を持っています:

arr = []
arr[0] = "ab"
arr[1] = "abcdefgh"
arr[2] = "abcd"

ソート後、出力配列は次のようになります。

arr[0] = "abcdefgh"
arr[1] = "abcd"
arr[2] = "ab"  

つまり、各要素の長さの降順になります。

77
ramesh kumar

Array.sort メソッドを使用して配列をソートできます。ストリングの長さをソート基準として考慮するソート関数は、次のように使用できます。

arr.sort(function(a, b){
  // ASC  -> a.length - b.length
  // DESC -> b.length - a.length
  return b.length - a.length;
});

注:["a", "b", "c"]を文字列の長さでソートしても、["a", "b", "c"]が返されるとは限りません。 仕様 によると:

ソートは必ずしも安定しているわけではありません(つまり、等しいと比較する要素が必ずしも元の順序のままであるとは限りません)。

目的が長さ、次に辞書順でソートすることである場合、追加の基準を指定する必要があります。

["c", "a", "b"].sort(function(a, b) {
  return a.length - b.length || // sort by length, if equal then
         a.localeCompare(b);    // sort by dictionary order
});
195
Salman A

あなたが尋ねたようにjavascriptで文字列の長さに応じて、並べ替えがあります:

[バブルソートによる問題の解決] [1]

[1]: http://jsfiddle.net/sssonline2/vcme3/2/enter code here

3
shareef

Array.sortメソッドを使用して、この配列をソートできます。

ES5ソリューション

var array = ["ab", "abcdefgh", "abcd"];

array.sort(function(a, b){return b.length - a.length});

console.log(JSON.stringify(array, null, '\t'));

ascendingソート順:a.length - b.length

descendingソート順:b.length - a.length

ES6ソリューション

注意:すべてのブラウザがES6コードを理解できるわけではありません!

ES6では、矢印関数式を使用できます。

let array = ["ab", "abcdefgh", "abcd"];

array.sort((a, b) => b.length - a.length);

console.log(JSON.stringify(array, null, '\t'));
2
Bharata

Salmanの答えに基づいて、それをカプセル化する小さな関数を作成しました。

function sortArrayByLength(arr, ascYN) {
        arr.sort(function (a, b) {           // sort array by length of text
            if (ascYN) return a.length - b.length;              // ASC -> a - b
            else return b.length - a.length;                    // DESC -> b - a
        });
    }

でそれを呼び出す

sortArrayByLength( myArray, true );

このページ で説明されているように、残念ながら、関数をArrayプロトタイプに追加できない/すべきではないことに注意してください。

また、パラメーターとして渡された配列を変更し、何も返しません。これは配列の複製を強制し、大きな配列には適していません。誰かがより良いアイデアを持っている場合は、コメントしてください!

0
Nico

@shareefの回答を簡潔にするために修正しました。私が使う、

.sort(function(arg1, arg2) { return arg1.length - arg2.length })

0
user3054109