整数の配列を正しくソートする方法


848

整数のみが含まれることがわかっている配列から最高値と最低値を取得するのは、思ったより難しいようです。

var numArray = [140000, 104, 99];
numArray = numArray.sort();
alert(numArray)

これが表示されると思い99, 104, 140000ます。代わりに表示されます104, 140000, 99。したがって、ソートは値を文字列として処理しているようです。

実際に整数値でソートするソート関数を取得する方法はありますか?


10
上位の回答がすべての浮動小数点値を正しく処理していないことに注意してください。特に、どれもを処理しませんNaN。に対処する高度にランク付けされた回答を見るとよいでしょうNaN
Quuxplusone 2015年

3
ところで、たくさんの整数を並べ替える場合は、並べ替えのカウントなどの整数の並べ替えアルゴリズムを使用する便利です。時間カウントソートは、配列のサイズに比例してスケールを実行するために必要です:O(n)。ここでのすべてのソリューションは、効率の悪い比較ソートを使用しますが、O(n * log n)です。
Web_Designer 2017年

1
@Web_Designerカウントのソートは、配列ではなく数値範囲に関して線形です。例えば、ソーティング[1,1000000]アルゴリズムが0より大きいであるセルの値を参照すること1000000に1間の各配列インデックスをスキャンしなければならないため、2つのステップ以上かかります
yters

2
@ytersハッシュマップを使用すると、ソートされる配列に表示される整数にのみ注意を払うことができます。これにより、配列サイズに対してソートが線形になります。
ケビン

1
最も簡単な方法は、ブラウザとノードの両方でネイティブに動作する同形ソート配列モジュールを使用して、あらゆるタイプの入力、計算フィールド、カスタムソート順をサポートすることです。
ロイド

回答:


1236

デフォルトでは、sortメソッドは要素をアルファベット順にソートします。数値でソートするには、数値ソートを処理する新しいメソッド(sortNumber、以下に表示)を追加するだけです-

var numArray = [140000, 104, 99];
numArray.sort(function(a, b) {
  return a - b;
});

console.log(numArray);

ES6では、これを矢印関数で簡略化できます。

numArray.sort((a, b) => a - b); // For ascending sort
numArray.sort((a, b) => b - a); // For descending sort

ドキュメンテーション:

Mozilla Array.prototype.sort()は、InfinityまたはNaNを含まない配列に対してこの比較関数を推奨しています。(なぜならInf - Inf 0ではなくNaNである)。

キーによるオブジェクトのソートの例も。


148
いいね。しかし、JavaScriptから数値ソートを取得するための特別な方法は本当にありませんか?
peirix 2009年

39
ああ、これは箱から出してすぐです!しかし、実際的でない場合は、JavaScriptの最初に関数を配列クラスclassにバインドできます。// Array.prototype.sortNormal = function(){return this.sort(function(a、b){return a -b})} //任意の配列で.sortNormal()を呼び出すと、数値で並べ替えられます
Jack Franzen

13
なぜa> bではなくabなのか。操作機械のエラーを回避するために最後の1つをお勧めします
Luca Davanzo、2015

35
@Velthune比較関数は-1、0、または+1を返す必要があります。a> bはtrueまたはfalseのみを返します。
イバン・ペレス

48
このコードは、アロー関数を使用して短縮できます。numberArray.sort((a, b) => (a - b));わーい!これは、すぐに使える方法に近いと思います。注:JSエンジンがArrow Functionsをサポートしているかどうかを確認してください。
КонстантинВан

174

上記のすべての答えを基にして、次のように1行で行うこともできます。

var numArray = [140000, 104, 99];

// ES5
numArray = numArray.sort(function (a, b) {  return a - b;  });

// ES2015
numArray = numArray.sort((a, b) => a - b);

//outputs: 99, 104, 140000

8
固定@bodyflex: var arr = [140000, 104, 99].sort(function(a,b) { return a-b; });。またはES6でよりコンパクトlet arr = [140000, 104, 99].sort((a,b) => a-b);
00500005 2016年

1
上記のコメントで述べたように、矢印関数はここでは不適切であり、このように使用することはできません。矢印構文の副作用を使用して単語functionとを切り取っていますreturnが、実際にはを渡すというarrow関数の真の目的を使用していませんthis。このコードは、いくつかのthisコンテキストパッシングが発生していることを意味しますが、発生していません。ほんの数文字を節約するために、他の開発者がコードを読むのを混乱させます。副作用に依存しない-目的を持ったコード!
バンバリー16

12
@bamberyコンテキストの変更のみに矢印関数を使用する必要があるとは思いません…
Ted Morin

7
@bambery、あなたは実際にアロー関数が何をしているかを誤解しています。どういうわけかthis関数に渡されると思いますが、それは真実ではありません。実際には、通常は親変数を上書きするa thisarguments変数の作成を無視します。thisアロー関数内で使用できる唯一の理由は、字句スコープです。
2017

2
@bamberyは熟成しませんでした... 3年後、最新のJavaScript開発では、矢印関数のみを使用しています。:)
Kip

71

array.sortはデフォルトで辞書式ソートを行います。数値ソートの場合、独自の関数を提供します。簡単な例を次に示します。

function compareNumbers(a, b)
{
    return a - b;
}

numArray.sort(compareNumbers);

また、並べ替えは「インプレース」で機能するため、割り当ての必要はありません。


上記のコードを理解できませんでした。「return a-b」は昇順の並べ替えをどのように行うのですか?
vikramvi

a <bの場合、compareNumbersは負の数を返します。a> bの場合、正になります。等しい場合は、0を返す
ポール・ディクソン

38

この回答は既存の回答の一部と同等ですが、ECMAScript 6の矢印関数は、読みやすさを犠牲にすることなくインラインソート関数を定義できる、よりコンパクトな構文を提供します。

numArray = numArray.sort((a, b) => a - b);

現在、ほとんどのブラウザでサポートされています


1
「読みやすさを犠牲にすることなく」。これは主観的です。いくつかの単純な整数でそれは読みやすいです。より複雑なオブジェクトを操作していて、プロパティでソートしたい場合、それほどではありません。
トリスタン

3
@Tristan、オブジェクトのプロパティでの並べ替えは、この構文を使用してかなりきれいに行うことができます。並べ替えるオブジェクトのプロパティが数値である場合:objArray=objArray.sort((a,b)=>a.numProperty - b.numProperty);プロパティが文字列である場合:objArray=objArray.sort((a,b)=>a.strProperty.localeCompare(b.strProperty))‌​;この質問では、整数の配列の並べ替えについて具体的に質問します
jjjjs

34

みんながコンパレータ機能をに渡すことを勧めている理由に驚いsort()ています。

数値をソートするには TypedArrayを作成するだけです

var numArray = new Uint32Array([140000, 104, 99]);
numArray = numArray.sort();
alert(numArray)


4
TypedArrayを使用すると、ソートが約5倍高速になります。さらに高速化したい場合は、hpc-algorithms npmパッケージがRadix SortとCounting Sortを実装しており、ここでいくつかの回答が示唆しています。
-DragonSpit

うわー、これが存在することを知りませんでした!
pixelearth

21

ソート機能の動作がおかしい理由

ドキュメントから:

[...]配列は、各要素の文字列変換に従って、各文字のUnicodeコードポイント値に従ってソートされます。

あなたは印刷する場合のUnicodeポイント値配列のを、それが明確になります。

console.log("140000".charCodeAt(0));
console.log("104".charCodeAt(0));
console.log("99".charCodeAt(0));

//Note that we only look at the first index of the number "charCodeAt(  0  )"

これは、「49、49、57」を返します。

49 (unicode value of first number at 140000)
49 (unicode value of first number at 104)
57 (unicode value of first number at 99)

ここで、140000と104は同じ値(49)を返したため、最初のインデックスを切り取り、再度チェックします。

console.log("40000".charCodeAt(0));
console.log("04".charCodeAt(0));

//Note that we only look at the first index of the number "charCodeAt(  0  )"

52 (unicode value of first number at 40000)
40 (unicode value of first number at 04)

これをソートすると、次のようになります。

40 (unicode value of first number at 04)
52 (unicode value of first number at 40000)

つまり、104は140000の前になります。

したがって、最終結果は次のようになります。

var numArray = [140000, 104, 99];
numArray = numArray.sort();
console.log(numArray)

104, 140000, 99

結論:

sort() 数値の最初のインデックスのみを見てソートします。 sort()整数が他よりも大きいかどうかは関係ありません。数字のユニコードの値を比較し、2つの等しいユニコード値がある場合は、次の数字があるかどうかをチェックして、それも比較します。

正しくソートするには、ここでsort()説明するように比較関数を渡す必要があります


ヒント:これは私の説明にすぎません。実際にコードを調べたわけではありません。したがって、この答えを完全に信頼しないでください。
ブラック

17

私はaksに同意しますが、

return a - b;

あなたは使うべきです

return a > b ? 1 : a < b ? -1 : 0;

18
誰もあなたのより読みにくい三項演算を使用する必要がある理由を説明できますか?私の知る限り、同じ結果になります。
stefannew 2015年

6
この答えは、等しい値も考慮に入れて、同じ場所に残します。
Maarten00 2015

23
そして、a-bはしませんか?
ブライアンレイナー、2015

12
「return ab」は、この質問の特定のケース(javascript、およびintであることがわかっているすべての入力項目)には適切な場合がありますが、個人的には、より標準的な3進形式を好みます。 、より多くのデータ型。たとえば、Cでは、abがオーバーフローして、ソートの無限ループ、メモリの破損、クラッシュなどにつながる可能性があります。とはいえ、NaNや混合型が含まれている場合、3進形式でも正常に機能しません。
Don Hatch

8
>そして<、まだ、文字列としてaとbを比較します。
vriesdemichael

11

新しいES6の世界では、並べ替えがはるかに簡単です

numArray.sort((a,b) => a-b);

それがあなたが必要とするすべてです:)


10

JavaScriptでは、sort()メソッドのデフォルトの動作は、配列の値をアルファベット順にソートすることです。

数値でソートするには、数値ソート関数を定義する必要があります(これは非常に簡単です)。

...
function sortNumber(a, b)
{
  return a - b;
}

numArray = numArray.sort(sortNumber);

8

Array.prototype.sort()は配列をソートするためのgo toメソッドですが、注意が必要な問題がいくつかあります。

並べ替えの順序は、デフォルトでは辞書式であり、配列内の値のタイプに関係なく数値ではありません。配列がすべて数値の場合でも、すべての値が文字列に変換され、辞書順に並べ替えられます。

したがって、sort()およびreverse()メソッドを以下のようにカスタマイズする必要があります。

参照URL

配列内の数値をソートするため

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

配列内の数値を逆にするため

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

参照URL


6

質問はすでに答えられています、最短の方法はsort()メソッドを使用することです。ただし、数値の配列を並べ替える他の方法を探していて、サイクルも好きな場合は、次を確認してください。

挿入ソート

上昇:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length; i++) {
    var target = numArray[i];
    for (var j = i - 1; j >= 0 && (numArray[j] > target); j--) {
        numArray[j+1] = numArray[j];
    }
    numArray[j+1] = target
}
console.log(numArray);

降順:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length; i++) {
    var target = numArray[i];
    for (var j = i - 1; j >= 0 && (numArray[j] < target); j--) {
        numArray[j+1] = numArray[j];
    }
    numArray[j+1] = target
}
console.log(numArray);

選択ソート:

上昇:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length - 1; i++) {
    var min = i;
    for (var j = i + 1; j < numArray.length; j++) {
        if (numArray[j] < numArray[min]) {
            min = j;
        }
    }
    if (min != i) {
        var target = numArray[i];
        numArray[i] = numArray[min];
        numArray[min] = target;
    }
}
console.log(numArray);

降順:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length - 1; i++) {
    var min = i;
    for (var j = i + 1; j < numArray.length; j++) {
        if (numArray[j] > numArray[min]) {
            min = j;
        }
    }
    if (min != i) {
        var target = numArray[i];
        numArray[i] = numArray[min];
        numArray[min] = target;
    }
}
console.log(numArray);

楽しんで


これらのいずれかは、この回答が示唆するように、TypedArray で使用するよりも小さな配列の方が実際に高速ですか。確かに、これらはO(n ^ 2)アルゴリズムであるため、中規模から大規模の配列では高速にはなりません。sort()
Peter Cordes

5

以下の「数値的に」関数は、コールバック関数として提供される場合、多くの場合数値の配列を数値的にソートする目的を果たします。

function numerically(a, b){
    return a-b;
}

array.sort(numerically); 

ただし、配列に非常に大きな負の数が含まれるまれなケースでは、abがJavaScriptが処理できる最小の数よりも小さくなると、オーバーフローエラーが発生する可能性があります。

したがって、数値関数を記述するより良い方法は次のとおりです。

function numerically(a, b){
   if(a < b){
      return -1;
   } else if(a > b){
      return 1;
   } else {
      return 0;
   }
}

1
JavaScriptの数値は浮動小数点です。IEEE754は、オーバーフローとアンダーフローのルールを定義しています。これには、オーバーフローを+ -Infinityに、アンダーフローを非正規または+ -0.0に含めます。2つの数値の減算が+ -0.0にアンダーフローして、それらが大きく、ほぼ同じであっても、私はそうは思わない。2つのdoubleの違いは常に別のゼロ以外のdoubleとして表現できます(オーバーフローしない限りDBL_MIN - DBL_MAX)。ただし、アンダーフローは不可能です。壊滅的なキャンセルは結果を不正確にし、その「有効数字」のほとんどを失いますa-bが、常にゼロではなく、a!= bの正しい符号を持ちます。
Peter Cordes

4

undefined、null、およびNaNを処理するには:Nullは0、NaNのように動作し、undefinedは終了します。

array = [3, 5, -1, 1, NaN, 6, undefined, 2, null]
array.sort((a,b) => isNaN(a) || a-b)
// [-1, null, 1, 2, 3, 5, 6, NaN, undefined]

3

要素値の通常の配列の場合のみ:

function sortArrayOfElements(arrayToSort) {
    function compareElements(a, b) {
        if (a < b)
            return -1;
        if (a > b)
            return 1;
        return 0;
    }

    return arrayToSort.sort(compareElements);
}

e.g. 1:
var array1 = [1,2,545,676,64,2,24]
**output : [1, 2, 2, 24, 64, 545, 676]**

var array2 = ["v","a",545,676,64,2,"24"]
**output: ["a", "v", 2, "24", 64, 545, 676]**

オブジェクトの配列の場合:

function sortArrayOfObjects(arrayToSort, key) {
    function compareObjects(a, b) {
        if (a[key] < b[key])
            return -1;
        if (a[key] > b[key])
            return 1;
        return 0;
    }

    return arrayToSort.sort(compareObjects);
}

e.g. 1: var array1= [{"name": "User4", "value": 4},{"name": "User3", "value": 3},{"name": "User2", "value": 2}]

**output : [{"name": "User2", "value": 2},{"name": "User3", "value": 3},{"name": "User4", "value": 4}]**

2

更新!答えの一番下までスクロールしsmartSortて、さらに楽しいプロップ添加剤を探しましょう!何でも
配列をソートします!

この関数の私の個人的なお気に入りの形式では、昇順または降順のパラメーターを使用できます。

function intArraySort(c, a) {
    function d(a, b) { return b - a; }
    "string" == typeof a && a.toLowerCase();
    switch (a) {
        default: return c.sort(function(a, b) { return a - b; });
        case 1:
                case "d":
                case "dc":
                case "desc":
                return c.sort(d)
    }
};

使い方は次のように簡単です:

var ara = function getArray() {
        var a = Math.floor(Math.random()*50)+1, b = [];
        for (i=0;i<=a;i++) b.push(Math.floor(Math.random()*50)+1);
        return b;
    }();

//    Ascending
intArraySort(ara);
console.log(ara);

//    Descending
intArraySort(ara, 1);
console.log(ara);

//    Ascending
intArraySort(ara, 'a');
console.log(ara);

//    Descending
intArraySort(ara, 'dc');
console.log(ara);

//    Ascending
intArraySort(ara, 'asc');
console.log(ara);

jsFiddle


または、コードスニペットの例はこちら!

function intArraySort(c, a) {
	function d(a, b) { return b - a }
	"string" == typeof a && a.toLowerCase();
	switch (a) {
		default: return c.sort(function(a, b) { return a - b });
		case 1:
		case "d":
		case "dc":
		case "desc":
		return c.sort(d)
	}
};

function tableExample() {
	var d = function() {
			var a = Math.floor(50 * Math.random()) + 1,
				b = [];
			for (i = 0; i <= a; i++) b.push(Math.floor(50 * Math.random()) + 1);
			return b
		},
		a = function(a) {
			var b = $("<tr/>"),
				c = $("<th/>").prependTo(b);
			$("<td/>", {
				text: intArraySort(d(), a).join(", ")
			}).appendTo(b);
			switch (a) {
				case 1:
				case "d":
				case "dc":
				case "desc":
					c.addClass("desc").text("Descending");
					break;
				default:
					c.addClass("asc").text("Ascending")
			}
			return b
		};
	return $("tbody").empty().append(a(), a(1), a(), a(1), a(), a(1), a(), a(1), a(), a(1), a(), a(1))
};

tableExample();
table { border-collapse: collapse; }
th, td { border: 1px solid; padding: .25em .5em; vertical-align: top; }
.asc { color: red; }
.desc { color: blue }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<table><tbody></tbody></table>


.smartSort( 'asc' | 'desc')

複数のアイテムでいっぱいの配列を並べ替える並べ替えメソッドをさらにお楽しみください!現在、「連想」(別名、文字列キー)については説明していませんが、あらゆる種類の値について説明しています。複数の値をソートするだけでなくascdescに応じて、それはまた、値の「グループ」の一定の「位置」を維持します。言い換えると; intは常に最初で、次に文字列、次に配列(はい、これを多次元にします!)、次にオブジェクト(フィルターなし、要素、日付)、最後に未定義とnullです。

"なぜ?" あなたが尋ねる。何故なの!

2種類のフレーバーが登場!1つ目はObject.defineProperty、メソッドをArray.protoypeオブジェクトに追加するために使用する新しいブラウザーが必要です。これにより、次のような自然な使用が容易になりますmyArray.smartSort('a')。古いブラウザを実装する必要がある場合、または単にネイティブオブジェクトを変更したくない場合は、[ メソッドのみ]バージョンまでスクロールしてください。

/* begin */
/* KEY NOTE! Requires EcmaScript 5.1 (not compatible with older browsers) */
;;(function(){if(Object.defineProperty&&!Array.prototype.smartSort){var h=function(a,b){if(null==a||void 0==a)return 1;if(null==b||void 0==b)return-1;var c=typeof a,e=c+typeof b;if(/^numbernumber$/ig.test(e))return a-b;if(/^stringstring$/ig.test(e))return a>b;if(/(string|number){2}/ig.test(e))return/string/i.test(c)?1:-1;if(/number/ig.test(e)&&/object/ig.test(e)||/string/ig.test(e)&&/object/ig.test(e))return/object/i.test(c)?1:-1;if(/^objectobject$/ig.test(e)){a instanceof Array&&a.smartSort("a");b instanceof Array&&b.smartSort("a");if(a instanceof Date&&b instanceof Date)return a-b;if(a instanceof Array&&b instanceof Array){var e=Object.keys(a),g=Object.keys(b),e=e.concat(g).smartSort("a"),d;for(d in e)if(c=e[d],a[c]!=b[c])return d=[a[c],b[c]].smartSort("a"),a[c]==d[0]?-1:1;var f=[a[Object.keys(a)[0]],b[Object.keys(b)[0]]].smartSort("a");return a[Object.keys(a)[0]]==f[0]?-1:1}if(a instanceof Element&&b instanceof Element){if(a.tagName==b.tagName)return e=[a.id,b.id].smartSort("a"),a.id==e[0]?1:-1;e=[a.tagName, b.tagName].smartSort("a");return a.tagName==e[0]?1:-1}if(a instanceof Date||b instanceof Date)return a instanceof Date?1:-1;if(a instanceof Array||b instanceof Array)return a instanceof Array?-1:1;e=Object.keys(a);g=Object.keys(b);e.concat(g).smartSort("a");for(c=0;20>c;c++){d=e[c];f=g[c];if(a.hasOwnProperty(d)&&b.hasOwnProperty(f)){if(a[d]instanceof Element&&b[f]instanceof Element){if(a[d].tagName==b[f].tagName)return c=[a[d].id,b[f].id].smartSort("a"),a[d].id==c[0]?-1:1;c=[a[d].tagName,b[f].tagName].smartSort("d"); return a[d].tagName==c[0]?1:-1}if(a[d]instanceof Element||b[f]instanceof Element)return a[d]instanceof Element?1:-1;if(a[d]!=b[f])return c=[a[d],b[f]].smartSort("a"),a[d]==c[0]?-1:1}if(a.hasOwnProperty(d)&&a[d]instanceof Element)return 1;if(b.hasOwnProperty(f)&&b[f]instanceof Element||!a.hasOwnProperty(d))return-1;if(!b.hasOwnProperty(d))return 1}c=[a[Object.keys(a)[0]],b[Object.keys(b)[0]]].smartSort("d");return a[Object.keys(a)[0]]==c[0]?-1:1}g=[a,b].sort();return g[0]>g[1]},k=function(a,b){if(null== a||void 0==a)return 1;if(null==b||void 0==b)return-1;var c=typeof a,e=c+typeof b;if(/^numbernumber$/ig.test(e))return b-a;if(/^stringstring$/ig.test(e))return b>a;if(/(string|number){2}/ig.test(e))return/string/i.test(c)?1:-1;if(/number/ig.test(e)&&/object/ig.test(e)||/string/ig.test(e)&&/object/ig.test(e))return/object/i.test(c)?1:-1;if(/^objectobject$/ig.test(e)){a instanceof Array&&a.smartSort("d");b instanceof Array&&b.smartSort("d");if(a instanceof Date&&b instanceof Date)return b-a;if(a instanceof Array&&b instanceof Array){var e=Object.keys(a),g=Object.keys(b),e=e.concat(g).smartSort("a"),d;for(d in e)if(c=e[d],a[c]!=b[c])return d=[a[c],b[c]].smartSort("d"),a[c]==d[0]?-1:1;var f=[a[Object.keys(a)[0]],b[Object.keys(b)[0]]].smartSort("d");return a[Object.keys(a)[0]]==f[0]?-1:1}if(a instanceof Element&&b instanceof Element){if(a.tagName==b.tagName)return e=[a.id,b.id].smartSort("d"),a.id==e[0]?-1:1;e=[a.tagName,b.tagName].smartSort("d");return a.tagName==e[0]?-1:1}if(a instanceof Date||b instanceof Date)return a instanceof Date?1:-1;if(a instanceof Array||b instanceof Array)return a instanceof Array?-1:1;e=Object.keys(a);g=Object.keys(b);e.concat(g).smartSort("a");for(c=0;20>c;c++){d=e[c];f=g[c];if(a.hasOwnProperty(d)&&b.hasOwnProperty(f)){if(a[d]instanceof Element&&b[f]instanceof Element){if(a[d].tagName==b[f].tagName)return c=[a[d].id,b[f].id].smartSort("d"),a[d].id==c[0]?-1:1;c=[a[d].tagName,b[f].tagName].smartSort("d");return a[d].tagName==c[0]?-1:1}if(a[d]instanceof Element||b[f]instanceof Element)return a[d]instanceof Element?1:-1;if(a[d]!=b[f])return c=[a[d],b[f]].smartSort("d"),a[d]==c[0]?-1:1}if(a.hasOwnProperty(d)&&a[d]instanceof Element)return 1;if(b.hasOwnProperty(f)&&b[f]instanceof Element)return-1;if(!a.hasOwnProperty(d))return 1;if(!b.hasOwnProperty(d))return-1}c=[a[Object.keys(a)[0]],b[Object.keys(b)[0]]].smartSort("d");return a[Object.keys(a)[0]]==c[0]?-1:1}g=[a,b].sort();return g[0]<g[1]};Object.defineProperty(Array.prototype,"smartSort",{value:function(){return arguments&& (!arguments.length||1==arguments.length&&/^a([sc]{2})?$|^d([esc]{3})?$/i.test(arguments[0]))?this.sort(!arguments.length||/^a([sc]{2})?$/i.test(arguments[0])?h:k):this.sort()}})}})();
/* end */

jsFiddle Array.prototype.smartSort( 'asc | desc')


使い方は簡単!まず、次のようなクレイジーな配列を作成します。

window.z = [ 'one', undefined, $('<span />'), 'two', null, 2, $('<div />', { id: 'Thing' }), $('<div />'), 4, $('<header />') ];
z.push(new Date('1/01/2011'));
z.push('three');
z.push(undefined);
z.push([ 'one', 'three', 'four' ]);
z.push([ 'one', 'three', 'five' ]);
z.push({ a: 'a', b: 'b' });
z.push({ name: 'bob', value: 'bill' });
z.push(new Date());
z.push({ john: 'jill', jack: 'june' });
z.push([ 'abc', 'def', [ 'abc', 'def', 'cba' ], [ 'cba', 'def', 'bca' ], 'cba' ]);
z.push([ 'cba', 'def', 'bca' ]);
z.push({ a: 'a', b: 'b', c: 'c' });
z.push({ a: 'a', b: 'b', c: 'd' });

並べ替えるだけです。

z.smartSort('asc'); // Ascending
z.smartSort('desc'); // Descending

メソッドのみ

単純な方法を除いて、上記と同じです!

/* begin */
/* KEY NOTE! Method `smartSort` is appended to native `window` for global use. If you'd prefer a more local scope, simple change `window.smartSort` to `var smartSort` and place inside your class/method */
window.smartSort=function(){if(arguments){var a,b,c;for(c in arguments)arguments[c]instanceof Array&&(a=arguments[c],void 0==b&&(b="a")),"string"==typeof arguments[c]&&(b=/^a([sc]{2})?$/i.test(arguments[c])?"a":"d");if(a instanceof Array)return a.sort("a"==b?smartSort.asc:smartSort.desc)}return this.sort()};smartSort.asc=function(a,b){if(null==a||void 0==a)return 1;if(null==b||void 0==b)return-1;var c=typeof a,e=c+typeof b;if(/^numbernumber$/ig.test(e))return a-b;if(/^stringstring$/ig.test(e))return a> b;if(/(string|number){2}/ig.test(e))return/string/i.test(c)?1:-1;if(/number/ig.test(e)&&/object/ig.test(e)||/string/ig.test(e)&&/object/ig.test(e))return/object/i.test(c)?1:-1;if(/^objectobject$/ig.test(e)){a instanceof Array&&a.sort(smartSort.asc);b instanceof Array&&b.sort(smartSort.asc);if(a instanceof Date&&b instanceof Date)return a-b;if(a instanceof Array&&b instanceof Array){var e=Object.keys(a),g=Object.keys(b),e=smartSort(e.concat(g),"a"),d;for(d in e)if(c=e[d],a[c]!=b[c])return d=smartSort([a[c], b[c]],"a"),a[c]==d[0]?-1:1;var f=smartSort([a[Object.keys(a)[0]],b[Object.keys(b)[0]]],"a");return a[Object.keys(a)[0]]==f[0]?-1:1}if(a instanceof Element&&b instanceof Element){if(a.tagName==b.tagName)return e=smartSort([a.id,b.id],"a"),a.id==e[0]?1:-1;e=smartSort([a.tagName,b.tagName],"a");return a.tagName==e[0]?1:-1}if(a instanceof Date||b instanceof Date)return a instanceof Date?1:-1;if(a instanceof Array||b instanceof Array)return a instanceof Array?-1:1;e=Object.keys(a);g=Object.keys(b);smartSort(e.concat(g), "a");for(c=0;20>c;c++){d=e[c];f=g[c];if(a.hasOwnProperty(d)&&b.hasOwnProperty(f)){if(a[d]instanceof Element&&b[f]instanceof Element){if(a[d].tagName==b[f].tagName)return c=smartSort([a[d].id,b[f].id],"a"),a[d].id==c[0]?-1:1;c=smartSort([a[d].tagName,b[f].tagName],"a");return a[d].tagName==c[0]?-1:1}if(a[d]instanceof Element||b[f]instanceof Element)return a[d]instanceof Element?1:-1;if(a[d]!=b[f])return c=smartSort([a[d],b[f]],"a"),a[d]==c[0]?-1:1}if(a.hasOwnProperty(d)&&a[d]instanceof Element)return 1; if(b.hasOwnProperty(f)&&b[f]instanceof Element||!a.hasOwnProperty(d))return-1;if(!b.hasOwnProperty(d))return 1}c=smartSort([a[Object.keys(a)[0]],b[Object.keys(b)[0]]],"a");return a[Object.keys(a)[0]]==c[0]?1:-1}g=[a,b].sort();return g[0]>g[1]};smartSort.desc=function(a,b){if(null==a||void 0==a)return 1;if(null==b||void 0==b)return-1;var c=typeof a,e=c+typeof b;if(/^numbernumber$/ig.test(e))return b-a;if(/^stringstring$/ig.test(e))return b>a;if(/(string|number){2}/ig.test(e))return/string/i.test(c)? 1:-1;if(/number/ig.test(e)&&/object/ig.test(e)||/string/ig.test(e)&&/object/ig.test(e))return/object/i.test(c)?1:-1;if(/^objectobject$/ig.test(e)){a instanceof Array&&a.sort(smartSort.desc);b instanceof Array&&b.sort(smartSort.desc);if(a instanceof Date&&b instanceof Date)return b-a;if(a instanceof Array&&b instanceof Array){var e=Object.keys(a),g=Object.keys(b),e=smartSort(e.concat(g),"a"),d;for(d in e)if(c=e[d],a[c]!=b[c])return d=smartSort([a[c],b[c]],"d"),a[c]==d[0]?-1:1;var f=smartSort([a[Object.keys(a)[0]], b[Object.keys(b)[0]]],"d");return a[Object.keys(a)[0]]==f[0]?-1:1}if(a instanceof Element&&b instanceof Element){if(a.tagName==b.tagName)return e=smartSort([a.id,b.id],"d"),a.id==e[0]?-1:1;e=smartSort([a.tagName,b.tagName],"d");return a.tagName==e[0]?-1:1}if(a instanceof Date||b instanceof Date)return a instanceof Date?1:-1;if(a instanceof Array||b instanceof Array)return a instanceof Array?-1:1;e=Object.keys(a);g=Object.keys(b);smartSort(e.concat(g),"a");for(c=0;20>c;c++){d=e[c];f=g[c];if(a.hasOwnProperty(d)&& b.hasOwnProperty(f)){if(a[d]instanceof Element&&b[f]instanceof Element){if(a[d].tagName==b[f].tagName)return c=smartSort([a[d].id,b[f].id],"d"),a[d].id==c[0]?-1:1;c=smartSort([a[d].tagName,b[f].tagName],"d");return a[d].tagName==c[0]?-1:1}if(a[d]instanceof Element||b[f]instanceof Element)return a[d]instanceof Element?1:-1;if(a[d]!=b[f])return c=smartSort([a[d],b[f]],"d"),a[d]==c[0]?-1:1}if(a.hasOwnProperty(d)&&a[d]instanceof Element)return 1;if(b.hasOwnProperty(f)&&b[f]instanceof Element)return-1; if(!a.hasOwnProperty(d))return 1;if(!b.hasOwnProperty(d))return-1}c=smartSort([a[Object.keys(a)[0]],b[Object.keys(b)[0]]],"d");return a[Object.keys(a)[0]]==c[0]?-1:1}g=[a,b].sort();return g[0]<g[1]}
/* end */

使用する:

z = smartSort(z, 'asc'); // Ascending
z = smartSort(z, 'desc'); // Descending

jsFiddleメソッドsmartSort(Array、 "asc | desc")


2

このコードを試してください:

HTML:

<div id="demo"></div>

JavaScriptコード:

<script>
    (function(){
        var points = [40, 100, 1, 5, 25, 10];
        document.getElementById("demo").innerHTML = points;
        points.sort(function(a, b){return a-b});
        document.getElementById("demo").innerHTML = points;
    })();
</script>

2

以下のようにこのコードを試してください

var a = [5, 17, 29, 48, 64, 21];
function sortA(arr) {
return arr.sort(function(a, b) {
return a - b;
})
;} 
alert(sortA(a));

それは本当ではないですか?
user7125929 2018

1
var numArray = [140000, 104, 99];
numArray = numArray.sort((a,b) => a-b);
alert(numArray)

4
StackOverflowへようこそ。あなたの答えは受け入れられた答えと同一です。これが受け入れられた回答よりも優先される理由を説明するために、回答に説明を追加できますか?
単にGed

1

JavaScriptでは必須ではありませんが、厳密に-1、0、または1を返す場合(PHPでの宇宙船演算子の動作と同様)、を使用できます。sort() compareFunctionMath.sign()

compareFunction以下、厳密-1を返し、0、または1:

numArray.sort((a, b) => Math.sign(a - b));

注: Math.sign()はInternet Explorerではサポートされていません。


0

これは、Arrayプロトタイプのメソッドとしてすでに提案され、受け入れられているソリューションです。

Array.prototype.sortNumeric = function () {
    return this.sort((a, b) => a - b);
};
Array.prototype.sortNumericDesc = function () {
    return this.sort((a, b) => b - a);
};

0

sortメソッドは、配列要素を文字列に変換します。したがって、以下の方法は、配列要素を持つ10進数でも正常に機能します。

let productPrices = [10.33, 2.55, 1.06, 5.77];
console.log(productPrices.sort((a,b)=>a-b));

期待どおりの結果が得られます。


0

sortメソッドのオーバーライド。

Array.prototype.sortInt = function(){
    this.sort(function(a,b){return a-b});
}


numbers = [12,8,21,5,1,34];
numbers.sortInt()
//output -> [1,5,8,12,21,34]

0

デフォルトのソート関数は、辞書順でのソートです。

var ar = [10000,3,200];
console.log(ar.sort());
//it will sort like :=> [10000, 200, 3]

上記のものは、私たちが数値に必要とするものではありません。したがって、整数があり、デフォルトのソート関数が機能していない場合(辞書順にソートされるため)、独自の関数を実装する必要があります。

var ar = [10000,3,-09,200];
function customSortHelpForNumber(number1, number2){
     return number1-number2;
}
console.log(ar.sort(customSortHelpForNumber));
//it will sort like :=> [3, 200, 10000]

それがどのように機能するかということを覚えておいてほしいと思いますか?ここでソート関数にメソッドを提供すると、毎回2つの数値が渡され、数値が返された場合

  • -ve値または0、最初の数値をそのままにします
  • + ve値を交換します。

これをすべての数値についてたどることで、整数の配列をソートします。

ES6を使用している場合は、矢印関数を記述します。

console.log(ar.sort((num1,num2)=> num1-num2));
    //it will sort like :=> [3, 200, 10000]

-1

utilsライブラリの並べ替え配列関数を次に示します。

sortArray: function(array) {
    array.sort(function(a, b) {
        return a > b;
    });
},

# Let's test a string array
var arr = ['bbc', 'chrome', 'aux', 'ext', 'dog'];
utils.sortArray(arr);
console.log(arr);
>>> ["aux", "bbc", "chrome", "dog", "ext", remove: function]

# Let's test a number array
var arr = [55, 22, 1425, 12, 78];
utils.sortArray(arr);
console.log(arr);
>>> [12, 22, 55, 78, 1425, remove: function]

3
これは間違いです!sort関数は、trueまたはfalseではなく、負の0または正の数値を返す必要があります。
jperelli 2016年

@jperelliが述べたように、sort関数は、ブール値ではなく数値を返す必要があります(等しい、上、下の3つの可能な状態がある場合、これは安定したソートが必要です)。あなたの答えが述べられているように、それは機能しません。a-b代わりに使用する必要があります。(あなたは空想を得てを行うことができますがNumber(a>b)-0.5、それはまだ安定したソートではありません)。
ecc521
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.