LoginSignup
0
1

More than 5 years have passed since last update.

オブジェクト配列をソートする

Last updated at Posted at 2018-10-07

まずは単一条件でソートしてみる

下記は社員を役職でソートする例

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: "担当"}

役職 > 名前 の優先順位の複数条件でソートできた

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1