二次元配列または連想配列の並び替え(ソート)
二次元配列または連想配列(ハッシュ)の並び替え(ソート)を行う方法をご紹介します。
1つのインデックス番号またはキーで並び替え
1つのインデックス番号またはキーで並び替える場合は次のような方法で可能です。
サンプルコード:インデックス番号
JavaScript
var data = [
[ 4, 98 ],
[ 3, 66 ],
[ 1, 72 ],
[ 7, 98 ],
[ 2, 100 ],
[ 6, 91 ],
[ 5, 91 ]
];
// 昇順
data.sort(function(a, b) {
return a[1] - b[1];
});
// 降順
data.sort(function(a, b) {
return b[1] - a[1];
});
サンプルコード:キー
JavaScript
var data = [
{ id : 4, eval : "S", name : "太郎", grades : 98 },
{ id : 3, eval : "C", name : "花子", grades : 66 },
{ id : 1, eval : "B", name : "夏樹", grades : 72 },
{ id : 7, eval : "S", name : "菊子", grades : 98 },
{ id : 2, eval : "S", name : "春子", grades : 100 },
{ id : 6, eval : "A", name : "秋江", grades : 91 },
{ id : 5, eval : "A", name : "冬樹", grades : 91 }
];
// 昇順
data.sort(function(a, b) {
return a.grades - b.grades;
});
// 降順
data.sort(function(a, b) {
return b.grades - a.grades;
});
複数のインデックス番号またはキーで並び替え
複数のインデックス番号またはキーで並び替える場合は次のような方法で可能です。
関数定義
JavaScript
/**
* 二次元配列または連想配列の並び替え
* @param {*[]} array 並び替える配列
* @param {'ASC'|'DESC'} [order] 並び替える方法
* @param {...*} args 並び替えの基準となるキー
* @return {*[]} 並び替えられた配列
*/
var sortBy = function(array, order) {
if (!order || !order.match(/^(ASC|DESC)$/i)) order = 'ASC';
order = order.toUpperCase();
var keys = [];
for (var i = 2, len = arguments.length; i < len; i++) keys.push(arguments[i]);
var targets = [].concat(array);
targets.sort(function(a, b) {
for (var i = 0, len = keys.length; i < len; i++) {
if (typeof keys[i] === 'string') {
if (order === 'ASC') {
if (a[keys[i]] < b[keys[i]]) return -1;
if (a[keys[i]] > b[keys[i]]) return 1;
} else {
if (a[keys[i]] > b[keys[i]]) return -1;
if (a[keys[i]] < b[keys[i]]) return 1;
}
} else {
var localOrder = keys[i].order || 'ASC';
if (!localOrder.match(/^(ASC|DESC)$/i)) order = 'ASC';
order = order.toUpperCase();
if (localOrder === 'ASC') {
if (a[keys[i].key] < b[keys[i].key]) return -1;
if (a[keys[i].key] > b[keys[i].key]) return 1;
} else {
if (a[keys[i].key] > b[keys[i].key]) return -1;
if (a[keys[i].key] < b[keys[i].key]) return 1;
}
}
}
return 0;
});
return targets;
};
引数
引数名 | 型 | 説明 | |
---|---|---|---|
第一引数 必須 |
array | *[] | ソート対象の配列 |
第二引数 | order | 'ASC' | 'DESC' | 並び替える方法 昇順 ... 'ASC' 降順 ... 'DESC' |
第三引数以降 | args | ...* | 並び替える基準となるインデックス番号またはキー 第三引数が一番優先度が高く、第四・第五となるにつれて低くなる |
戻り値
並び替えられた二次元配列または連想配列を返します。
元の配列は変更しません。
使い方
サンプルコード:インデックス番号
JavaScript
var data = [
[ 4, 98 ],
[ 3, 66 ],
[ 1, 72 ],
[ 7, 98 ],
[ 2, 100 ],
[ 6, 91 ],
[ 5, 91 ]
];
// 昇順
var result = sortBy(data, 'ASC', 1, 0);
// 降順
var result = sortBy(data, 'DESC', 1, 0);
サンプルコード:キー
JavaScript
var data = [
{ id : 4, eval : "S", name : "太郎", grades : 98 },
{ id : 3, eval : "C", name : "花子", grades : 66 },
{ id : 1, eval : "B", name : "夏樹", grades : 72 },
{ id : 7, eval : "S", name : "菊子", grades : 98 },
{ id : 2, eval : "S", name : "春子", grades : 100 },
{ id : 6, eval : "A", name : "秋江", grades : 91 },
{ id : 5, eval : "A", name : "冬樹", grades : 91 }
];
// 昇順
var result = sortBy(data, 'ASC', 'grades', 'id');
// 降順
var result = sortBy(data, 'DESC', 'grades', 'id');