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

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

新規登録して質問してみよう
ただいま回答率
85.35%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

606閲覧

JSで配列で重複した値が指定個数以上ならばTrueを返したい

Hayao819

総合スコア34

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/08/03 15:42

編集2021/08/03 15:55

やりたいこと

数値のリストでなにかのデータが指定個数以上ならTrueを返す配列CountArrayValueを作成したいです。

関数

CountArrayValueは1つめの引数に対象の配列、1つめの引数に指定個数(数値)を指定します。

動作させたいコード

文字の重複ならいくつか方法が見つかりましたが数値だとどうしてもわかりませんでした。

javascript

1const Myarray1 = [0 , 2 , 2 , 2, 2] 2const Myarray2 = [0 , 1, 2] 3 4if (CountArrayValue(Myarray1, 4)){ 5 console.log("4つの重複がある") //こっちを出したい 6}else{ 7 console.log("重複なし") 8} 9 10if (CountArrayValue(Myarray2, 4)){ 11 console.log("4つの重複がある") 12}else{ 13 console.log("重複なし") //こっちを出したい 14}v

参考にしようとしたサイト

https://qiita.com/saka212/items/408bb17dddefc09004c8

追記

すみません肝心のコードを忘れていました
現時点でできているコードです
構文エラーで2回目のforEachでエラーが出ます
また、どうもスマートにかけないのでもっといい方法があったら教えてほしいです。

javascript

1function CountArrayValue(array, number){ 2 let count = {}; 3 array.forEach(i => { 4 count[i] = (count[i] || 0) + 1; 5 }); 6 count.forEach((i)=>{ 7 if (count[i] == number){ 8 return true; 9 } 10 }) 11 return false; 12 13}

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

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

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

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

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

hentaiman

2021/08/03 15:46

どこで詰まってるのか全く分かりません 作りかけのコードを載せましょう
Hayao819

2021/08/03 15:55

すみません追加しました
guest

回答2

0

いまのコードをベースにしたらこんな感じでしょか

javascript

1function CountArrayValue(array, number){ 2 let count = {}; 3 for (let i of array) { 4 count[i] = (count[i] || 0) + 1; 5 if (count[i] == number) return true; 6 } 7 return false; 8}

投稿2021/08/03 21:16

takasima20

総合スコア7464

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

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

Hayao819

2021/08/03 23:12

ありがとうございます。シンプルでわかりやすいです。
guest

0

ベストアンサー

このようなコードでどうでしょうか

javascript

1function CountArrayValue(arr, thr) { 2 return Math.max(...Object.values(arr.reduce((acc, val) => { 3 acc[val] = (acc[val] || 0) + 1; 4 return acc; 5 }, {}))) >= thr; 6}

コードの説明を加えたものを書いておきます。

javascript

1function CountArrayValue(arr, thr) { 2 // {値: 出現回数} の形式のオブジェクト 3 const countsPerValue = arr.reduce((counts, currentValue) => { 4 // もし初回出現(出現回数がセットされていない)なら出現回数のところを0に設定 5 if(!counts[currentValue]) counts[currentValue] = 0; 6 7 // 出現回数を1回増やす 8 counts[currentValue]++; 9 10 return counts; 11 }, {}); 12 13 // ここでは出現回数だけを知りたいので、出現回数だけの配列にする 14 const counts = Object.values(countsPerValue); 15 16 // countsの最大値を求める 17 const maxCount = Math.max(...counts); 18 19 // 最大の出現回数が閾値以上か判定 20 return maxCount >= thr; 21}

投稿2021/08/03 15:53

編集2021/08/04 11:22
stmkza

総合スコア478

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

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

Hayao819

2021/08/03 16:00

ありがとうございます!!!! 完全にやりたかったことはこれなのですが、原理がさっぱりわかりません。 `thr`と`Math.max`を比較しているのと、`Math.max`の引数でオフジェクトの配列をスプレット構文で引数として渡しているのはわかりますが、その中の`arr.deduce`の中身がわからないです
stmkza

2021/08/03 16:06 編集

arr.reduceで配列の中身それぞれについて {配列の値: 出現回数} のオブジェクトにカウントしています。 「if(!acc[val]) acc[val] = 0;」 は初回の出現のときに出現回数を0にリセット、次の行で出現回数をインクリメントしています。
stmkza

2021/08/03 16:17

回答にコメントを書いたものを追記しておきました。
Hayao819

2021/08/03 16:33

変数に分けてみるとわかりやすかったです。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問