質問: ### 前提・実現したいこと 現在JSで以下のようなオブジェクトをjsonファイルからgetし、 valueがtrueなものだけをソートして再度オブジェクトとして作成しようとしてます。 調べてみましたが、あまり良い方法が見つからず、なにかアドバイスいただけませんでしょうか。 ``` //jsonからgetしたオブジェクト { id01: false, id02: true, id03: false, id04: false, id05: true } //以下のようにソートしたい { id02: true, id05: true } ```
回答: 愚直にfor文つかってやるならこうですね。 ``` var data = { id01: false, id02: true, id03: false, id04: false, id05: true }; var result = {}; for (let key in data) { if (data[key]) result[key] = data[key]; } console.log(result); // {id02: true, id05: true} ``` JavaScriptは配列には良い感じのメソッドが用意されており、 良い感じにメソッドチェーンを使って加工していけますが、 Objectはハッシュマップ(連想配列)としての利用法はあまり想定されておらず、そういうものはありません。 Map型がありますしね。 一度Object.keysやObject.entriesを使って配列に変換してからメソッドチェーンに乗せていく形になります。 余談なのでES2015のコードを使いまくってます。 ``` var data = { id01: false, id02: true, id03: false, id04: false, id05: true }; // Object.keysとArray.prototype.reduceを使う var result = Object.keys(data) .reduce((o, key) => { if (data[key]) o[key] = data[key]; return o; }, {}); console.log(result); // {id02: true, id05: true} ``` JavaScriptのreduceは状態変数が減るのですが、 コードが重いのでワンライナーにはなりません。 かといってLodashにもこれこれみたいなメソッドがなく、 難解なRamda.jsのfilterを使うしかありません。 Ramda.jsを読んで使えそうと思うなら試してみても良いと思います。