Javascriptで配列・オブジェクトの配列のソート

よく使うのでメモ。JavascriptのバージョンはES2015。
次のような配列やオブジェクトの配列(連想配列の配列)があった場合、

//普通の配列
var array = [5,3,7];

//オブジェクトの配列
var objArray = [
    {'name':'apple','price':300},
    {'name':'orange','price':200},
    {'name':'banana','price':100}
];

1 配列のソート

関数

/**
* @function Array.prototype.sortArray 配列をソートする
*/
if(!Array.prototype.sortArray){
    Object.defineProperty(Array.prototype, 'sortArray', {
        configurable: false,
        enumerable: false,
        writable: false,
        /**
        * @string order ソートの順序 ('asc' or 'desc')
        */
        value: function(order) {
            switch(order){
                case 'asc':  //昇順
                    this.sort((a,b) => a-b);
                    break;
                case 'desc':  //降順
                    this.sort((a,b) => b-a);
                    break;
                default:  //昇順・降順の指定がない場合は降順でソート
                    this.sort((a,b) => b-a);
                    break;
            }
            return this;
        }
    });
}

処理→出力

var array = [5,3,7];

console.log(array.sortArray('desc')); //降順でソート

結果

[ 7, 5, 3 ]

2 オブジェクトの配列のソート

関数

キーから値を取得し、バリデーションを追加しただけで、基本的に配列のソートと同じ。

/**
* @function Array.prototype.sortObjArray オブジェクトの配列をソートする
*/
if(!Array.prototype.sortObjArray){
    Object.defineProperty(Array.prototype, 'sortObjArray', {
        configurable: false,
        enumerable: false,
        writable: false,
        /**
        * @string key ソートに用いるオブジェクトのキー
        * @string order ソートの順序 ('asc' or 'desc')
        */
        value: function(key,order) {
            //オブジェクトの配列であるか確認
            if(Object.prototype.toString.call(this[0])!=='[object Object]'){
                console.log('TypeError: Other than an array of object was passed.');
                return false;
            }
            switch(order){
                case 'asc':  //昇順
                    this.sort((a,b) => a[key]-b[key]);
                    break;
                case 'desc':  //降順
                    this.sort((a,b) => b[key]-a[key]);
                    break;
                default:  //昇順・降順の指定がない場合は降順でソート
                    this.sort((a,b) => b[key]-a[key]);
                    break;
            }
            return this;
        }
    });
}

処理→出力

var objArray = [
    {'name':'apple','price':300},
    {'name':'orange','price':200},
    {'name':'banana','price':100}
];

console.log(objArray.sortObjArray('price','asc')); //昇順でソート

結果

[ { name: 'banana', price: 100 },
  { name: 'orange', price: 200 },
  { name: 'apple', price: 300 } ]

Leave a Reply

Your email address will not be published. Required fields are marked *