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

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

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

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

Q&A

解決済

4回答

5818閲覧

javascriptでの2次配列の重複カウント

nano-dia

総合スコア32

JavaScript

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

0グッド

0クリップ

投稿2016/10/05 04:36

編集2016/10/05 07:22

2次元配列aから重複する配列数を指定することでその配列を取り出せず困っています。

javascript

1a=[["あ","い","う"],["え","お"],["い","う","え","お"],["あ","い","う"],["い","う","お"],["あ","い","う"],["え","お"]]

例えば、配列["あ","い","う"]は3つ重複しており、count=3 を指定することで["あ","い","う"]が取り出せるようにしたいです。
また、count=2とすると["え","お"]が取り出せることを想定しております。

pythonではできているみたいです。pythonを用いて2次元配列から重複する配列を取り出す
私は,javascriptで行いたいので皆さんお知恵をお借りしたいです。よろしくお願いします。

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

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

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

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

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

tkturbo

2016/10/05 04:42

ちなみにcount=1, count=0の場合はそれぞれ何が取り出されるのを想定されてますか?
nano-dia

2016/10/05 05:34 編集

count=1の場合は,重複ではないですが [い,う,え,お] [い,う,お]を count=0はもともと空の配列だと思うので想定していません。
think49

2016/10/05 04:54

ご自身で書かれたコードを [編集] で追記されるとより具体的な回答が付くと思います。ちなみに、例示のコードは SyntaxError になりました。
yambejp

2016/10/05 04:54

仮に[あ,い,う]と[あ,う,い]があっても同じではないと考えてよいですね?
nano-dia

2016/10/05 04:59

yambejpさん [あ,い,う]と[あ,う,い]は違うので,a=[[あ,い,う],[あ,う,い]]だとそうなりますね。 一応自分としては,それぞれの配列にArray.prototype.sort()をしている前提で 質問しました。言葉足らずですみません。
nano-dia

2016/10/05 05:03

think49さん 回答ありがとうございます。例示のコードは SyntaxErrorだったのですねpythonなら出来るのだなと感心しただけでした。コードの検証ありがとうございます。
think49

2016/10/05 05:08

pythonのコードは [[1,2,3],...] なのでエラーになりませんが、例示は [[あ,い,う],...] なので "あ" を解釈できずに SyntaxError になります。ブラウザの開発者ツールを活用すると SyntaxError が出ていることが分かります。ご自身で書かれたコードはあるでしょうか。
guest

回答4

0

作るのは簡単ですが、コードを書くと制作依頼になるのでアドバイスだけ。
次のようにすれば実装可能だと思います。

  1. Array#redoce で回す
  2. Array#filter で回し、JSON.stringify で同値の配列要素数が3の配列を取得する
    (配列の要素にプリミティブ値以外があるなら JSON.stringify の代わりに for 文か Array#forEach で配列の要素比較をする)
  3. Array#push で該当配列を格納する

ちなみに例示のコードは SyntaxError になりますね。

Re: nano-dia さん

投稿2016/10/05 04:53

編集2016/10/05 05:06
think49

総合スコア18162

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

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

0

ベストアンサー

ES2015文法をふんだんに使って書くと

JavaScript

1const groups = [ 2 ["あ","い","う"], 3 ["え","お"], 4 ["い","う","え","お"], 5 ["あ","い","う"], 6 ["い","う","お"], 7 ["あ","い","う"], 8 ["え","お"], 9]; 10 11const serials = groups.map(JSON.stringify); 12 13const serialToCount = serials.reduce( 14 (map, serial) => ( 15 map[serial] = (map[serial] || 0) + 1, 16 map 17 ), 18 {} 19); 20 21const countToArrays = Object.keys(serialToCount).reduce( 22 (map, serial) => ( 23 (map[serialToCount[serial]] = map[serialToCount[serial]] || []).push(JSON.parse(serial)), 24 map 25 ), 26 {} 27); 28 29console.log(countToArrays); 30console.log(countToArrays[2]);

さらにBabelでコンパイルする前提なら, countToArrays の生成時に

JavaScript

1const countToArrays = Object.entries(serialToCount).reduce( 2 (map, [serial, count]) => ( 3 (map[count] = (map[count] || [])).push(JSON.parse(serial)), 4 map 5 ), 6 {} 7);

としてObject.entriesと分割代入を使ったほうがきれいですね.

投稿2016/10/05 06:41

編集2016/10/05 07:10
mpyw

総合スコア5223

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

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

mpyw

2016/10/05 06:57 編集

質問の解釈を微妙に間違えてるみたいなので修正します… (flattenする必要無かったですね…)
guest

0

JSONとか使わなくてもこんな感じか。。。

javascript

1var a=[["あ","い","う"],["え","お"],["い","う","え","お"],["あ","い","う"],["い","う","お"],["あ","い","う"],["え","お"]]; 2var o = []; 3a.forEach(function(e){ o[e] = (!o[e]) ? 1 : (o[e] + 1); }); 4get = function(num){ 5 let s = []; 6 for(key in o) { 7 if(o[key] == num){ s.push(key); } 8 } 9 return (s.length <= 1) ? s[0] : s; 10}; 11console.log(get(0)); 12console.log(get(1)); 13console.log(get(2)); 14console.log(get(3)); 15

投稿2016/10/05 06:02

編集2016/10/05 06:10
tkturbo

総合スコア5572

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

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

mpyw

2016/10/05 07:09

JSON.stringifyを使わないとデータの中に「,」が含まれていたときに予期しない動作になるので,個人的には微妙な感じです…
think49

2016/10/05 07:54 編集

To: mpyw さん 横からすみません。仰る意味が理解できなかったので解説が欲しいです。 個人的には JSON.stringify は new Object, new Array 以外の Object 型を扱えないのが微妙な感じです。 tkturbo さんのコードでは for-in 文で __proto__ 上のプロパティを拾ってしまう挙動が気になりました(Object.keys が良いような)。
mpyw

2016/10/05 07:35

a.forEach(function(e){ o[e] = (!o[e]) ? 1 : (o[e] + 1); }); ↑console.log(o); をすると意味がわかると思います(暗黙的に「,」でjoinされてます
tkturbo

2016/10/05 07:50

to)mypwさん:あー、確かに「,」を含む文字列は考慮してなかったです。配列にアクセスする添え字はJSON.stringifyしといたほうがいいですね。 to)think49さん: こちらもおっしゃる通りですね→Object.keys
think49

2016/10/05 08:02

To: mpyw さん なるほど。oのプロパティ名に格納時に Array#toString が働いて String 型に変換して評価されていまうという事ですね。 'あ' と {toString:function(){ return 'あ'; }} が同一評価されてしまう問題もありますね。 {toString:function(){ return 'あ'; }} は JSON.strinfigy でも対応できないので new Map を使うのが一番良いのかもしれません。 To: tkturbo さん 後で気が付いたのですが、var o = {}; じゃないでしょうか。 key が数字ではないので new Object か Object.create(null) が望ましいように思いました。
guest

0

何の工夫もなく冗長にやるとこんな感じです

var a=[["あ","い","う"],["え","お"],["い","う","え","お"],["あ","い","う"],["い","う","お"],["あ","い","う"],["え","お"]]; var b={}; b.add=function(arr){ if (!this["vals"]) this["vals"]={}; for(var i=0;i<arr.length;i++){ var key=JSON.stringify(arr[i]); if (!this["vals"][key]) this["vals"][key]=0; this["vals"][key]++; } }; b.get=function(num){ if (!this["vals"]) return null; var ret=[]; for(var i in this["vals"]){ if(this["vals"][i]==num){ ret.push(JSON.parse(i)); } } if(ret.length==0) return null; if(ret.length==1) return ret[0]; return ret; }; b.add(a); console.log(b.get(0)); console.log(b.get(1)); console.log(b.get(3));

投稿2016/10/05 05:32

編集2016/10/05 05:35
yambejp

総合スコア114829

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問