LoginSignup
11
9

More than 5 years have passed since last update.

JavaScriptで連想配列のソート

Last updated at Posted at 2018-03-02

流れ

「JavaScriptでオブジェクトのソートってなんかメソッドあったような。。」
「なんだっけ。。」※そもそも連想配列という言葉すら忘れている
「調べてみるとソートを自分で実装しないといけないっぽいのかな?」
「SQLのorder by的なすごい便利なのあったような気がする?」
といつもなるので備忘録。

ライブラリ

https://lodash.com/docs/4.17.5
lodashというすごいメジャーなライブラリが便利です。

実装

See the Pen vue2.x orderBy by watabean (@watabean) on CodePen.

簡単に説明

lodashのインポートはこのように記述
(今回はcodePenで書いていて↓の記述はないです)

<script src="lodash.js"></script>

元データはこのような形


    members: [
      { name: 'tanaka', age: 20 },
      { name: 'yamada', age: 25 },
      { name: 'watanabe', age: 29 },
      { name: 'watanabe', age: 27 },
      { name: 'watanabe', age: 25 },
      { name: 'kato', age: 27 },
      { name: 'sato', age: 27 },
    ]

1つのキー(name)でソートしたければ以下のような書き方。

_.orderBy(this.members, ['name'], ['asc']);

2つのキー(name, age)でソートしたければ以下のような書き方になります。

_.orderBy(this.members, ['name', 'age'], ['asc', 'asc']);

ascだと昇順、descだと降順になります。
直感的でわかりやすいと思います。

関係ない話

Vue.jsだと1系ではorderByフィルタあったけど
2系からはなくなったので自分で書くか、このようにライブラリを使う形になると思います。

結論

JavaScriptでの連想配列のソートはlodashでやると簡単でした。

ソース(codepenで見れるから不要だけど。。)

<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">
  <title>vue2.x orderBy</title>


  <link rel='stylesheet prefetch' href='https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-beta/css/bootstrap.min.css'>



</head>

<body>

<div id="app" class="container">
  <h3>元データ</h3>
  <ol>
    <li v-for="member in members">{{ member }}</li>
  </ol>
  <h3>1つのキーでソート(name)</h3>
  <ol>
    <li v-for="member in this.getMemberOrderByName">{{ member }}</li>
  </ol>
  <h3>2つのキーでソート(name, age)</h3>
  <ol>
    <li v-for="member in this.getMemberOrderByNameAge">{{ member }}</li>
  </ol>
</div>

<script src='https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js'></script>

<script>
new Vue({
  el: '#app',
  data: {
    members: [
      { name: 'tanaka', age: 20 },
      { name: 'yamada', age: 25 },
      { name: 'watanabe', age: 29 },
      { name: 'watanabe', age: 27 },
      { name: 'watanabe', age: 25 },
      { name: 'kato', age: 27 },
      { name: 'sato', age: 27 },
    ]
  },
  computed: {
    getMemberOrderByName() {
      return _.orderBy(this.members, ['name'], ['asc']);
    },
    getMemberOrderByNameAge() {
      return _.orderBy(this.members, ['name', 'age'], ['asc', 'asc']);
    }
  }
})
</script>

</body>

</html>

11
9
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
11
9