Javascript Json配列をソートする例

メモ。sortの引数に関数を指定するというのが、よく意味がわからないがちゃんとソートしてくれる。

function compare( a, b ){
  var r = 0;
  if( a.age < b.age ){ r = -1; }
  else if( a.age > b.age ){ r = 1; }

  return ( -1 * r );
  //return r;
}

var myArray = [
 { id: 1, name: "鈴木", age: 30 },
 { id: 2, name: "田中", age: 29 },
 { id: 3, name: "佐藤", age: 5 },
 { id: 4, name: "佐藤", age: 35 },
 { id: 5, name: "鈴木", age: 40 }
];

console.log("" + JSON.stringify(myArray.sort( compare )));

JSON配列をクイックソートする

//クイックソート関数
function quickSort(arr, start, end, key, order){
    var pivot = arr[Math.floor((start + end) / 2)];
    var left  = start;
    var right = end;

    while(true){
        if(order === 'desc'){
            while(arr[left][key] > pivot[key]){
                left++;
            }
            while(pivot[key] > arr[right][key]){
                right--;
            }
        }else if(order === 'asc'){
            while(arr[left][key] < pivot[key]){
                left++;
            }
            while(pivot[key] < arr[right][key]){
                right--;
            }
        }
        //leftとrightの値がぶつかったら、そこでグループ分けの処理を止める。
        if(right <= left){
            break;
        }

        //rightとrightの値がぶつかっていない場合、leftとrightを交換
        //交換後にleftを後ろへ、rightを前へ一つ移動する
        var tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
        left++;
        right--;
    }

    //左側に分割できるデータがある場合、quickSort関数を呼び出して再帰的に処理を繰り返す。
    if(start < left - 1){
        quickSort(arr, start, left - 1, key, order);
    }
    //右側に分割できるデータがある場合、quickSort関数を呼び出して再帰的に処理を繰り返す。
    if(right + 1 < end){
        quickSort(arr, right + 1, end, key, order);
    }
}

var myArray = [
 { name: "AAA", age: 30 },
 { name: "BBB", age: 29 },
 { name: "CCC", age: 50 },
 { name: "DDD", age: 70 },
 { name: "EEE", age: 80 },
 { name: "FFF", age: 20 },
 { name: "GGG", age: 50 },
 { name: "HHH", age: 40 }
];

quickSort(myArray, 0, myArray.length - 1, "age", "desc");

//結果の表示    
console.log(myArray);