質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

3596閲覧

Javascriptでオブジェクトのvalueがtrueのものだけを絞り込み、再度オブジェクトとして出力したい

aa316316

総合スコア39

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/02/06 09:41

前提・実現したいこと

現在JSで以下のようなオブジェクトをjsonファイルからgetし、
valueがtrueなものだけをソートして再度オブジェクトとして作成しようとしてます。
調べてみましたが、あまり良い方法が見つからず、なにかアドバイスいただけませんでしょうか。

//jsonからgetしたオブジェクト { id01: false, id02: true, id03: false, id04: false, id05: true } //以下のようにソートしたい { id02: true, id05: true }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2019/02/06 09:46

ご自身で試されたコードを質問文に追記し、「何」が「どのように」わからないのか、コードのどの部分で詰まっているのかなどを具体的に追記されたほうが回答が望めると思います。
papinianus

2019/02/06 09:48

質問の範囲はファイルの読み取りからですか?抽出とソート部分ですか?
Lhankor_Mhy

2019/02/06 10:57

「valueがtrueなものだけをソート」とありますが、JavaScriptのオブジェクトの列挙可能プロパティは順序が保証されていません。なので、ソートは難しいと思います。
kei344

2019/02/08 02:30

まだ質問が「受付中」になっていますが、「ベストアンサー」を選び「解決済」にされてはいかがでしょうか。
guest

回答3

0

ベストアンサー

こんにちは。

こんな方法もありますという一案を回答します。
Lodash_.pickBy を使います。

javascript

1const obj = { id01: false, id02: true, id03: false, id04: false, id05: true }; 2 3const obj2 = _.pickBy(obj, v => v); 4 5console.log(obj2); // => 表示例: Object {id02=true, id05=true}

ちなみに、上記のコードで表示結果が、 Object {id02=true, id05=true} のように id02, id05 の順に表示されていても、ソートされているわけではないと考えたほうがよいです。というのも、以下のように、Object のプロパティには順序がないからです。

4.3.3 Object

An object is a member of the type Object. It is an unordered collection of properties each of which contains a primitive value, object, or function. A function stored in a property of an object is called a method.

ですので、上記のコードで作った obj2 のエントリをプロパティの昇順で並べた配列を得たいのであれば、例えば以下のようにします。

javascript

1const sortedEntries = Object.entries(obj2).sort((e1,e2) => e1[0].localeCompare(e2[0])); 2 3console.log(sortedEntries); // => [["id02", true], ["id05", true]]

     

 

以下は、上記に挙げたコードを動作確認するためのものです。

以上、参考になれば幸いです。

投稿2019/02/06 11:24

jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aa316316

2019/02/06 16:41

ご丁寧にご回答ありがとうございます! Lodashは使ったことがないのですが、聞くところではとても便利みたいですね! また、オブジェクトは順序がないということは知りませんでした。。配列にしなければいけないということですね。 上記、参考にさせていただきます!ありがとうございます!
jun68ykt

2019/02/07 06:15

どういたしまして。 > Lodashは使ったことがないのですが、聞くところではとても便利みたいですね! はい。便利ですよ。ご質問のようなことをやるためのプログラムを書くには、段階として、以下のようなステップを踏むとよいと思います。 ①まず for ループを作って(たとえ多少冗長なコードになったとしても)確実に要求を満たすコードを書ける。 ②次に、reduce をはじめ、map、 forEach などのArray のメソッドで関数を引数にとるものを作って、①よりもコード量を短くして書ける。 ③ 上記②がそれなりに出来るようになったら、②でコードを書こうとしたときに、「今やろうとしていることは、Lodash に用意されているんじゃないか?」と思い、Lodash のマニュアルや stackoverflow などを調べて、あれば使ってみる。 > オブジェクトは順序がないということは知りませんでした。。 最終的に何かがソートされた状態で結果が欲しいという場合、どこかで sort() メソッド https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort を使うことになりますが、このメソッドを使ってソートの対象となるものと、ソート結果として得られるもの、両方ともに配列(Array)であるということを銘記しておくとよいでしょう。
guest

0

愚直にfor文つかってやるならこうですね。

JavaScript

1var data = { id01: false, id02: true, id03: false, id04: false, id05: true }; 2var result = {}; 3for (let key in data) { 4 if (data[key]) result[key] = data[key]; 5} 6console.log(result); 7// {id02: true, id05: true}

JavaScriptは配列には良い感じのメソッドが用意されており、
良い感じにメソッドチェーンを使って加工していけますが、
Objectはハッシュマップ(連想配列)としての利用法はあまり想定されておらず、そういうものはありません。
Map型がありますしね。

一度Object.keysObject.entriesを使って配列に変換してからメソッドチェーンに乗せていく形になります。
余談なのでES2015のコードを使いまくってます。

JavaScript

1var data = { id01: false, id02: true, id03: false, id04: false, id05: true }; 2 3// Object.keysとArray.prototype.reduceを使う 4var result = Object.keys(data) 5 .reduce((o, key) => { 6 if (data[key]) o[key] = data[key]; 7 return o; 8 }, {}); 9console.log(result); 10// {id02: true, id05: true}

JavaScriptのreduceは状態変数が減るのですが、
コードが重いのでワンライナーにはなりません。

かといってLodashにもこれこれみたいなメソッドがなく、
難解なRamda.jsのfilterを使うしかありません。
Ramda.jsを読んで使えそうと思うなら試してみても良いと思います。

投稿2019/02/06 10:02

miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aa316316

2019/02/06 16:44

ご回答ありがとうございます! やはり、オブジェクトは一度配列に変換してから加工していくのが一般的なのですね。 あまり配列やオブジェクトの操作に慣れていないため、大変参考になりました。 上記のコードで無事に期待していた動作を確認できました! ありがとうございます!
guest

0

javascript

1const json = { id01: false, id02: true, id03: false, id04: false, id05: true }; 2let rst = [...Object.entries (json)].reduce ((a,[b,c])=>(c?a[b]=c:null,a),{}); 3 4console.log (rst); 5

投稿2019/02/06 10:02

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問