まずは単一条件でソートしてみる
下記は社員を役職でソートする例
let classes = ['部長', '課長', '主任', '担当'];
let members = [
{ name: 'すずききよこ', class: '主任' },
{ name: 'たかはししょう子', class: '課長' },
{ name: 'やまだいちろう', class: '担当' },
{ name: 'もとやまひろき', class: '部長' },
{ name: 'うづきかおる', class: '担当' },
{ name: 'あおきもろのぶ', class: '担当' },
{ name: 'かわしたみずき', class: '担当' },
];
let sortedMembers = members.sort(function (x, y) {
return classes.indexOf(x.class) - classes.indexOf(y.class);;
});
console.log(sortedMembers);
結果
0:{name: "もとやまひろき", class: "部長"}
1:{name: "たかはししょう子", class: "課長"}
2:{name: "すずききよこ", class: "主任"}
3:{name: "やまだいちろう", class: "担当"}
4:{name: "うづきかおる", class: "担当"}
5:{name: "あおきもろのぶ", class: "担当"}
6:{name: "かわしたみずき", class: "担当"}
役職リストのindexを比較して、indexが若い役職順に並ぶようにした
複数条件(役職 + 名前)でソート
役職と社員の配列は変えずに、sortの中に条件を加える
indexOfが何度も実行されるのを避ける為に実行結果は変数classDiff
に格納する
~~省略~~
let sortedMembers = members.sort(function (x, y) {
let classDiff = classes.indexOf(x.class) - classes.indexOf(y.class);
// 役職が同じ場合は名前の文字列順でソート
if (classDiff === 0) {
return x.name > y.name;
}
return classDiff;
});
console.log(sortedMembers);
結果
0:{name: "もとやまひろき", class: "部長"}
1:{name: "たかはししょう子", class: "課長"}
2:{name: "すずききよこ", class: "主任"}
3:{name: "あおきもろのぶ", class: "担当"}
4:{name: "うづきかおる", class: "担当"}
5:{name: "かわしたみずき", class: "担当"}
6:{name: "やまだいちろう", class: "担当"}
役職 > 名前 の優先順位の複数条件でソートできた