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

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

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

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

Q&A

解決済

2回答

2335閲覧

javascriptでのリスト作成

nano-dia

総合スコア32

JavaScript

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

0グッド

1クリップ

投稿2016/12/05 07:28

編集2016/12/05 08:03

次のJSONファイルがあったとき

json

1{ 2hoge:[ 3{1:["a","b","c","d"]}, 4{2:["c","d","a","d"]} 5] 6}

次のようなリストをjavascriptで作りたいのですがどうすればいいでしょうか。

json

1{ 2 a:{b:1,c:2,d:3}, 3 b:{a:1,c:1,d:1}, 4 c:{a:2 b:1,d:3}, 5 d:{a:2 b:1,c:2} 6}

同じ配列に文字が含まれていたらカウントしていきたいのですが。
hoge.1から始めると,["a","b","c","d"]なので,

json

1{ 2 a:{b:1,c:1,d:1}, 3 b:{a:1,c:1,d:1}, 4 c:{a:1 b:1,d:1}, 5 d:{a:1 b:1,c:1} 6}

となり,次にhoge.2では["c","d","a","d"]で"b"はないのでb
はカウントされず,"d"は2回あるのでaとcのdには2回足すようにしたいです。

json

1{ 2 a:{b:1,c:1+1,d:1+2}, 3 b:{a:1,c:1,d:1}, 4 c:{a:1+1 b:1,d:1+2}, 5 d:{a:1+1 b:1,c:1+1} 6}

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

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

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

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

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

maisumakun

2016/12/05 07:36

作りたいリストがどのような規則で上から作られているのか、ぱっとわかりませんので、詳しい説明をお願いします。
yambejp

2016/12/05 07:41

「 c:{a:2 b:1,d:2},」→ 「c:{a:2 b:1,d:3},」ではないですか?
yambejp

2016/12/05 07:59

修正依頼には書きづらいので、回答の方に指摘してあります
guest

回答2

0

ベストアンサー

そもそも

{

hoge:[
{1:["a","b","c","d"]},
{2:["c","d","a","d"]}
}

この時点で文法エラーですね
またかりにhogeが配列をもっているとして、0番めの要素から1のパラメータ、
1番めの要素から2のパラメータを抜き出すのは構造的におかしい

javascript

1//最低でもこう 2{ 3hoge:[ 4{1:["a","b","c","d"]}, 5{1:["c","d","a","d"]}, 6] 7} 8 9//普通はこう 10{ 11hoge:[ 12["a","b","c","d"], 13["c","d","a","d"], 14] 15} 16 17//もしくはこう 18{ 19hoge:{ 201:["a","b","c","d"], 212:["c","d","a","d"], 22} 23} 24

ではないですか?

追記

とりあえず地道に冗長に処理してみてください

javascript

1var obj_0={ 2hoge:[ 3{1:["a","b","c","d"]}, 4{2:["c","d","a","d"]} 5] 6}; 7var obj_1={}; 8for(var i=0;i<obj_0.hoge.length;i++){ 9 for(var j in obj_0.hoge[i]){ 10 var obj_2=obj_0.hoge[i][j].filter(function (x, y, z){return z.indexOf(x) === y;}); 11 var obj_3=obj_0.hoge[i][j]; 12 for(var k=0;k<obj_2.length;k++){ 13 if(typeof obj_1[obj_2[k]]=="undefined"){obj_1[obj_2[k]]={};} 14 for(var l=0;l<obj_3.length;l++){ 15 if(obj_2[k]==obj_3[l]){continue;} 16 if(typeof obj_1[obj_2[k]][obj_3[l]]=="undefined"){ 17 obj_1[obj_2[k]][obj_3[l]]=1; 18 }else{ 19 obj_1[obj_2[k]][obj_3[l]]++; 20 } 21 } 22 } 23 } 24} 25console.log(obj_1);

投稿2016/12/05 07:59

編集2016/12/05 08:49
yambejp

総合スコア114767

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

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

yambejp

2016/12/05 08:53

一応ご提示のままのデータを処理する方法は追記しときます
guest

0

作成したいリストがわかりにくかったのですが、こういうことでしょうか?

JavaScript

1// 例 2var obj = { 3 hoge: [ 4 { 1:["a","b","c","d"] }, 5 { 2:["c","d","a","d"] } 6 ] 7}; 8 9makeObj(obj); 10 11 12function makeObj(srcList) { 13 var map = { }; 14 15 srcList['hoge'].forEach(function(obj) { 16 for (var no in obj) { 17 obj[no].forEach(function(alphabet) { 18 if (! (alphabet in map)) { 19 // mapにアルファベットが含まれていなければカウントに1を設定 20 map[alphabet] = 1; 21 } 22 else { 23 // mapにアルファベットが含まれていればカウントをインクリメント 24 map[alphabet]++; 25 } 26 }); 27 } 28 }); 29 // 例では、map = {a: 2, b: 1, c: 2, d: 3} が完成 30 31 var destObj = { }; 32 33 for (var outerAlphabet in map) { 34 // アルファベットがキーの空オブジェクトを追加、その参照をinnerObjで保持 35 var innerObj = destObj[outerAlphabet] = { }; 36 37 for (var innerAlphabet in map) { 38 if (innerAlphabet === outerAlphabet) { 39 continue; 40 } 41 42 // アルファベットとそのカウントをinnerObjに追加 43 innerObj[innerAlphabet] = map[innerAlphabet]; 44 } 45 } 46 47 return destObj; 48}

投稿2016/12/11 04:38

naomi3

総合スコア1105

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問