🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

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

Q&A

解決済

2回答

1482閲覧

jsで特定のキーを持つプロパティをカウントする方法

marutto

総合スコア32

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

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

0グッド

0クリップ

投稿2019/11/29 14:40

java scriptでオブジェクトに対し、
値が入っているかをチェックしつつ、かつ特定のキーを持つプロパティをカウントする方法は、
どんなやり方が考えられるでしょうか?

・詳細
DBから取り出したデータの内、特定のキーを持つデータの数を数えたいです。
データの構成は以下の通りです。

problem{ // DBから取得したデータ配列 name: ... category: ... problem1: ... problem2: ... problem3: null problem4: null problem5: null }

problem2以降は入力必須ではないため、値がnullの可能性もあります。

・やったこと
nullであろうとkeyは絶対あるので、for文とnullかどうかを判定しました。

ProblemAmount() { // return console.log(typeof this.drill); let amount = 0; for (let i = 1; i <= 10; i++) { if (!this.drill["problem".i] === null) { ++amount; console.log(amount); } } return amount; // 0 }

しかし、上記のコードを実行しても0が返ってきてしまい、対処に詰まってしまいました。

お手数かけますが、アドバイスをいただけますと幸いです。

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

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

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

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

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

kei344

2019/11/29 14:43

問題を再現できるコードを提示されたほうが回答が付きやすいですよ。
guest

回答2

0

ベストアンサー

JavaScript

1const data = { 2 a: 42, 3 b: 43, 4 c: null, 5 d: null, 6 e: 108, 7 f: 109, 8};

というデータを対象に、2例挙げます。

JavaScript

1let counter = 0; 2for (const key in data) { 3 if (data[key] !== null) counter++; 4} 5console.log(counter); 6//=> 4

JavaScript

1console.log(Object.entries(data).reduce((acc, [key, value]) => acc + (value !== null ? 1 : 0), 0)); 2//=> 4

追記:
jun68yktさんの回答を見て、自分が質問の意図を取りそびれていたと気付かされました。
と、いうことは質問者さんのコード、以下の部分を…

JavaScript

1if (!this.drill["problem".i] === null) {

以下のように修正すれば…

JavaScript

1if (!(this.drill["problem"+i] === null)) { 2// もしくは 3if (this.drill["problem"+i] !== null) {

質問者さんの期待通り動くんじゃないでしょうか。

投稿2019/11/29 15:14

編集2019/11/29 16:21
shinji709

総合スコア805

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

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

marutto

2019/11/29 16:48

回答ありがとうございます。 仰る通り、真偽判定の仕方が間違っていたのを変えたらカウントできました! jun68ykt様の回答とどちらにしようか迷いましたが、 こちらのコードを採用しようと思うので、ベストアンサーにさせていただきます。
guest

0

こんにちは

以下のような data というオブジェクトがあるとして、

javascript

1const data = { 2 name: 'foo', 3 category: 'bar', 4 5 problem1: 'A', 6 problem2: 'B', 7 problem3: null, 8 problem4: 'C', 9 problem5: null, 10 problem6: null, 11 problem7: 'D', 12};

data のプロパティの中で、そのプロパティ名がproblem で始まり、かつ値が null(を含めfalsyな値)ではないものの数を求めるには、

javascript

1Object.entries(data) 2 .filter(([key, value]) => /^problem/.test(key) && value) 3 .length;

とすればよいかと思います。冒頭挙げた data の例だと、 4 が得られます。

以下にて動作確認できます。

参考になれば幸いです。

補足1

null ではないものは、(たとえfalsyな値であっても)全てカウントしたいのであれば、filterに与える条件の && の後を

javascript

1value !== null

とします。

補足2

蛇足ですが、もう一つ追記します。

配列やオブジェクトの操作で便利なライブラリ lodash の _.pickBy を使うと、与えられたオブジェクトから、ある条件を満たすプロパティだけをピックアップしたオブジェクトが得られます。

これを使うと、ご質問の要件は例えば以下のように書けます。

javascript

1const isNonFalsyProblem = (value, key) => key.startsWith('problem') && !!value; 2 3const availableProblems = _.pickBy(data, isNonFalsyProblem); 4 5const numKeys = Object.keys(availableProblems).length;

投稿2019/11/29 15:02

編集2019/11/30 00:40
jun68ykt

総合スコア9058

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

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

marutto

2019/11/29 16:58

回答ありがとうございます! filterで1つづつ取り出して、 正規表現を使ってkeyがproblem + valueがある値のlengthプロパティを参照する 配列操作やグローバルオブジェクトの使い方、とても参考になります! 丁寧にCodePenまで付けてくださり、ありがとうございました!
jun68ykt

2019/11/29 23:18

どういたしまして。解決したようで、よかったです。 オブジェクトの持つプロパティと値のペアを走査する場面で、Object.entries() は便利です。 それと、キーが "problem" で始まるという条件を、回答では正規表現を使って /^problem/.test(key) としましたが、正規表現を使わずとも、"〜で始まる" をチェックする専用のメソッドstartsWith があるので、 key.startsWith("problem") でもよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問