AngularJSには便利なソートするOrderByがあります。標準の比較方法では、numberを数字として、stringsをアルファベット順で比較してくれるのでとても便利です。でも、もしIPアドレスをソートしてほしい。と言われたらどうしましょうか。というのが今日のお話です。
IPアドレスは256進数だと考えよう。
まず悩んだ時にするのがGoogleでの検索です。探せど探せどどれがぴったりくるのかわからず、試行錯誤した結果みつけました。これです。プログラマーにはお馴染みにStack Overflowですが何せ英語ですから、読むのが大変。IP4の重みづけについて書いてある文章が一番ぴったりくると思うので、そこをつまみあげて説明します。
例えば、こんなIPアドレスがあったとします。192.5.48.198と
198.48.5.192
構成している要素は一緒なので、足したりかけたりしても意味がありません。もちろん、点をはぶいて、くっつけて数字としてソーティングなんてこともダメです。そこでここで紹介しているのが重みづけをする方法です。256進数だと思って計算しよう!ということらしいです。
これだけでぱっと頭に入る人はきっととても頭がいいはず。2進数を10進数に変換するときのような考え方ですね。
private getIPNumber(ip32: string): number { let num = 0; let addr = ip32.split("."); for (let i = 0; i < addr .length; i++) { let power = 3 - i; num += (( parseInt(addr [i], 10) % 256 * Math.pow(256, power) )); } return num; }
もちろんTypeScriptを利用しているのでメソッドとして書いています。これをOrderByのところで使ってあげたらいい感じでソーティング機能を実装することができます。