安定だと思ってたのにそうじゃなかったので

安定にできたのでここでコストでソートしたときに同じコストなら攻撃力順で
といったソートができるように
この場合攻撃力でソート後にコストでソートすればOK

修正版あり

(function(){
var orgsort = Array.prototype.sort;
Array.prototype.sort = function(f){
for(var i=0;i<this.length;i++){
this[i].__id__ = i;
}
var sorted = orgsort.call(this,function(a,b){
var ret = f(a,b);
if( ret == 0 ) return a.__id__>b.__id__ ? 1 : -1;
else return ret;
});
for(var i=0;i<sorted.length;i++){
delete sorted[i].__id__;
}
};
})();
 stableSort.js ←これを最初のほうでインクルード

javascriptの標準ではブラウザごとに安定かどうかが違うみたい
どこかでChromeは安定って聞いたけど昔の情報なのかそんなことなかった

ソート対象の数でソート方法が切り替わるのか、数が少ないと試した限り安定だったけど20程度になるともう安定じゃなくなってた

ソート対象の数で最も良いソート方法を選んでくれてるのなら自分でソート関数を一から作ってしまうとせっかく高速化するようになってるのを使えなくしてもったいないので元からあるsort関数を使う方法で作りました

ソートするときにその並びを保持して返り値が0(ソート基準の値が等しい)場合に元々の並びにするようにしてます
ソート関数が
 function(a,b){return a-b;}
みたいな0を返すようにしていれば問題ないですが
 function(a,b){return a>b?1:-1}
みたいに0を返さないようにしてると使えないです
数回試したところ問題無さそうですがバグがある可能性もなくはないです
元の並びを保持するためにプロパティに__id__を使うためにこの値が元々入ってるオブジェクトのソートはできません というか__id__の値を壊してしまいます


ところで安定というのは
ソートする基準の値が同じ時に元々の並びを保持するかです
id:1 , atk:200
id:2 , atk:100
id:3 , atk:100
ってデータをatkで昇順にソートした時に
id:2 , atk:100
id:3 , atk:100
id:1 , atk:200
になればatkが100のところは元々の並びidが2,3なので安定
id:3 , atk:100
id:2 , atk:100
id:1 , atk:200
になればatkが100のところは元々の並びからidの順が変わってるので非安定

たぶんこれであってるはず