本記事ではJavaScriptのsort()とfilterを併用して並び替えする方法を書いていきます。

JavaScriptのsort()とfilterを併用して並び替えする方法

本記事ではJavaScriptのsortとfilterを併用して並び替えする方法を書いていきます。

sortとfilterの使いどころ

sortとfilterを使いどころとして条件に一致した要素のみを取得し、並び替えをしたい時に使えます。私の場合、vue.jsとリアルタイム更新が可能なfirestoreのスナップショットで要素をステータスごとに分けて日付順に並び替える箇所で使用しました。firestoreにはorderby句もあるのですが、ステータス更新後リアルタイムでソートの並び替えをするにはcomputedでsortとfilterを使ってあげる必要があります。

JavaScriptのsort

JavaScriptにはsort()という便利なメソッドが用意されています。sortを使うと配列の要素を並び替えしてくれます。

例えば、下記のように[3,1,5]にsort()を使うと、[1,3,5]に並び変わります。

var arr = [3,1,5];
var result = arr.sort();
console.log(result);
// =>[ 1, 3, 5 ]

しかしながら、[3,10,5]をソートしようとすると[ 10, 3, 5 ]になる。

var arr = [3,10,5];
var result = arr.sort();
console.log(result);
// =>[ 10, 3, 5 ]

sort()を使って昇順に並び替えできない理由はsort()だと数値ではなく文字列として並び替えているからです。

この場合は下記のように記述すると適切にソートすることができます。

var arr = [3,10,5];
var result = arr.sort((a, b) => a - b);
console.log(result);
// =>[ 3, 5, 10 ]

日付をソートしてみる

続いて日付をソートしてみましょう

arr = [{
    "category": "python",
    "created_at": new Date("2019/03/21")
    },
    {
    "category": "ruby",
    "created_at": new Date("2020/03/21")
    },
    {
    "category": "python",
    "created_at": new Date("2020/01/21")
    },
    {
    "category": "python",
    "created_at": new Date("2020/03/03")
    }
]

arr.sort(function(a,b){
          if(a.created_at < b.created_at) return -1;
          if(a.created_at > b.created_at) return 1;
          return 0;
        });
        
        console.log(arr)

// =>[
  { category: 'python', created_at: 2019-03-21T00:00:00.000Z },
  { category: 'python', created_at: 2020-01-21T00:00:00.000Z },
  { category: 'python', created_at: 2020-03-03T00:00:00.000Z },
  { category: 'ruby', created_at: 2020-03-21T00:00:00.000Z }
]

sortとfilterを併用

続いてsortとfilterをsortしてみましょう。今回はカテゴリーがPythonに一致する要素のみをピックアップしてソートしていきます。

lists = [{
    "category": "python",
    "created_at": new Date("2019/03/21")
    },
    {
    "category": "ruby",
    "created_at": new Date("2020/03/21")
    },
    {
    "category": "python",
    "created_at": new Date("2020/01/21")
    },
    {
    "category": "python",
    "created_at": new Date("2020/03/03")
    }
]

var result = lists.filter((list) => list.category === "python")
.slice()
.sort(function(a,b){
          if(a.created_at < b.created_at) return -1;
          if(a.created_at > b.created_at) return 1;
          return 0;
        });
        
        console.log(result)
// =>[
  { category: 'python', created_at: 2019-03-21T00:00:00.000Z },
  { category: 'python', created_at: 2020-01-21T00:00:00.000Z },
  { category: 'python', created_at: 2020-03-03T00:00:00.000Z },
]

以上、JavaScriptのsort()とfilterを併用して並び替えする方法についてでした。

>文系エンジニア大学生の技術ブログ

文系エンジニア大学生の技術ブログ

社会が多様化していく中、大学生の学生生活も多様であるべきと考えています。主にエンジニア向けにITやプログラミングなどの技術系と大学生向けに休学、留学、海外生活、トビタテ留学、長期インターンに関する記事を書いています。