各要素の長さに基づいて配列を並べ替える方法は?


95

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

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

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

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

つまり、各要素の長さの降順で欲しい。


1
sortかなり簡単ですが、どこで困っていますか?
muは短すぎる

4
@muistooshortもデフォルトのsort()は文字列をアルファベット順にソートし、選択した答えに見られるようにstring.lengthソートを探していました:)
jave.web

回答:


231

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
});

これは、項目の長さを減らすことで配列をソートすることを付け加えます。
davidhq 2016

ahaコメントにあります:)最初はそれを見ませんでした
davidhq

情報を追加するだけです。このスニペットは、すべてのケースで機能するわけではありません。
Arunkumar Srisailapathi

arr = ['a'、 'b'、 'c'、 'd'、 'e'、 'f'、 'g'、 'h'、 'i'、 'k'、 'l']、失敗する
Arunkumar Srisailapathi

15
ES6の方法arr.sort((a, b) => b.length - a.length)
Fergal

4

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'));

昇順ソートの場合:a.length - b.length

降順ソートの場合: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'));



0

サルマンの答えに基づいて、私はそれをカプセル化する小さな関数を書きました:

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

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

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


これは、短い長さから長い長さへとソートされます
ミゲル

0
#created a sorting function to sort by length of elements of list
def sort_len(a):
    num = len(a)
    d = {}
    i = 0
    while i<num:
        d[i] = len(a[i])
        i += 1
    b = list(d.values())
    b.sort()
    c = []
    for i in b:
        for j in range(num):
            if j in list(d.keys()):
                if d[j] == i:
                    c.append(a[j])
                    d.pop(j)
    return c

1
コードを投稿するだけでは役に立ちません。コードの機能について簡単に説明してください。
coderpc

-1

このコードはトリックを行う必要があります:

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

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

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

-3
<script>
         arr = []
         arr[0] = "ab"
         arr[1] = "abcdefgh"
         arr[2] = "sdfds"
         arr.sort(function(a,b){
            return a.length<b.length
         })
         document.write(arr)

</script>

sortに渡す無名関数は、与えられた配列を並べ替える方法を伝えます。これが役立つことを願っています。これは混乱を招きますが、パラメータとして関数を渡すことにより、配列の要素を並べ替える方法をsort関数に伝えることができます。それは何をすべきか


5
返されるはずのソート比較関数は何ですか?ヒントは次のとおりです。ブール値ではありません。
muが短すぎる
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.