二次元配列または連想配列の並び替え(ソート)

二次元配列または連想配列(ハッシュ)の並び替え(ソート)を行う方法をご紹介します。

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

JavaScript逆引きリファレンス一覧へ戻る