web-dev-qa-db-ja.com

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

私が知っている配列から最大値と最小値を取得しようとすると整数しか含まれないため、思ったよりも難しいようです。

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

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

Sort関数に実際に整数値でソートさせる方法はありますか?

677
peirix

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

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

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

console.log(numArray);

ES6では、これを矢印関数で簡単にすることができます。

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

上記のすべての答えを基にして、次のように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
160
MarzSocks

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

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

numArray.sort(compareNumbers);

また、並べ替えは「その場で」機能するので、割り当ては不要です。

69
Paul Dixon

この答えは既存のいくつかの答えと同等ですが、ECMAScript 6 arrow functions は読みやすさを犠牲にすることなくインラインsort関数を定義することを可能にするはるかにコンパクトな構文を提供します。

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

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

36
jjjjs

Sort関数がとても奇妙に振舞う理由

ドキュメント から:

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

あなたが配列の unicode point values を表示するならば、それは明らかになるでしょう。

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()は、整数が他の整数より大きいかどうかを気にする必要はありません。数字のUnicodeの値を比較し、2つの等しいUnicode値がある場合は、次の数字があるかどうかを確認して比較します。

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

16
Black

私はaksに同意しますが、使用する代わりに

return a - b;

あなたが使うべきです

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

並べ替えが本当に遅くなるので、誰もがsort()に比較関数を渡すことをお勧めする理由は驚きです。

数字をソートするには、 any TypedArray を作成するだけです。

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

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

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

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

numArray = numArray.sort(sortNumber);
10
user130076

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

8
Merbin Joe

新しいES6の世界では、ソートを実行する方がはるかに簡単です

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

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

5
Chait

質問はすでに答えられています、最短の方法は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);

楽しむ

4

以下の 'numerically'関数は、コールバック関数として提供されている場合、多くの場合、数値の配列を数値的にソートする目的に役立ちます。

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

array.sort(numerically); 

ただし、配列に非常に大きい負の数が含まれることがまれにある場合、a-bの結果がJavaScriptが対応できる最小の数よりも小さくなると、オーバーフローエラーが発生する可能性があります。

したがって、数値関数を書くよりよい方法は次のとおりです。

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

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

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

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

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
Umesh

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

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>
1
Sunny S.M

未定義、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]
1
Ali Khosro

更新!さらに楽しくなるsmartSort小道具添加物の答えの下までスクロールしてください!
anything!の配列をソートします。

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

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

複数のアイテムでいっぱいになった配列を並べ替える並べ替え方法を使用して、さらに楽しくなりました現在「連想」(別名、文字列キー)をカバーしていませんが、あらゆるタイプの値についてカバーしています!それはそれに従って複数の値ascまたはdescをソートするだけでなく、それはまた値の「グループ」の一定の「位置」を維持します。言い換えると; intは常に最初に、次に文字列、次に配列(そう、多次元にしています!)、そしてObjects(フィルタなし、要素、日付)、そして最後に未定義のものとnullです。

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

今2つの味があります!最初のものは、メソッドをObject.definePropertyオブジェクトに追加するためにArray.protoypeを使用するため、新しいブラウザが必要です。これにより、naturalの使用が簡単になります(myArray.smartSort('a'))。古いブラウザ用に実装する必要がある場合、またはネイティブオブジェクトを変更することが単に好きでない場合は、 Method Only versionまでスクロールします。

/* 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(配列、 "asc | desc")

1
SpYk3HH

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

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

これが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]
0
firestoke
var numArray = [140000, 104, 99];
numArray = numArray.sort((a,b) => a-b);
alert(numArray)
0
Vardaman PK