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

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

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

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

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

Q&A

解決済

2回答

2270閲覧

ng-repeatで三重ループ(総当たり戦)を作成した際に親の親のインデックスが欲しい

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

0グッド

0クリップ

投稿2017/08/16 10:19

angularJSの1系で総当たり戦をテーブルで表示するプログラムを組んでいます。
tableを縦方向、横方向それぞれにループさせて組んだ時点で二重ループになっています。
二重ループの場合、親のインデックスは$parent.$indexで取得できますが、
組んでいる総当たり戦のプログラムではセルの中でデータに合致するものを探す際にさらにループを走らせており、三重ループになっています。
元はJSPだったので三重ループでも問題なかったのですが、
AngularJSに移植するとインデックスが取れない問題が発覚しました。

html

1<table border=1 class="table"> 2 <thead> 3 <tr> 4 <th></th> 5 <th>チーム名</th> 6 <th>試合</th> 7 <th>勝利</th> 8 <th>敗北</th> 9 <th>引き分け</th> 10 <th>勝率</th> 11 <th>勝ち点</th> 12 <th>打率</th> 13 <th>防御率</th> 14 <th ng-repeat="i in range(items.length)">対{{$parent.items.resultList[i].shortName}}</th> 15 </tr> 16 </thead> 17 <tbody> 18 <tr ng-repeat="resultList in items.resultList"> 19 <th>{{$index+1}}</th> 20 <td>{{resultList.teamName}}</td> 21 <td>{{resultList.gameCount}}</td> 22 <td>{{resultList.win}}</td> 23 <td>{{resultList.lose}}</td> 24 <td>{{resultList.draw}}</td> 25 <td>{{resultList.percentage | number:3}}</td> 26 <td>{{resultList.points}}</td> 27 <td>{{resultList.avg | number:3}}</a></td> 28 <td>{{resultList.era | number:2}}</a></td> 29 <div ng-repeat="i in range($parent.items.length)"> 30 <td ng-repeat="opponentList in $parent.items.opponentList"> 31 <!-- <div ng-if="$parent.items.resultList.teamId==opponentList.teamId && $parent.items.resultList2[i].teamId==opponentList.opponent">--> 32 <div> 33 {{opponentList.win}}-{{opponentList.lose}}({{opponentList.draw}})</div> 34 </td> 35 </div> 36 </tr> 37 </tbody> 38</table>

APIから受け渡すデータの形式です。

json

1resultList[0]:{ 2avg:0.4195 3draw:0 4era:4.5454545 5gameCount:11 6leagueId:35 7lose:2 8opponent:null 9percentage:0.8182 10points:38 11rank:null 12shortName:"A" 13teamId:3 14teamName:"A" 15win:9 16} 17 18opponentList[0]:{ 19draw:0 20leagueId:35 21lose:4 22opponent:3 23teamId:1 24win:1 25}

コメントアウトしている部分で本来データの表示非表示を判定していました。
range()は()内に指定した回数ループする関数です。
opponentListはチームID1のチームはチームID3のチームに対して1勝4敗0分というデータを表します。
リストの要素が1対1でセルに対応しています。
resultList2はresultListのコピーなので中身は同じです。

現在考えているアプローチとしては、

  • 親の親のインデックスが取れないか
  • 上記が無理ならコントローラ側のjsでデータを加工するか

データを加工するにしても、
二重ループの中でループさせずにデータを紐付けたい、
あるいは
ループさせても親の親のインデックスを使わない構成にしたい

という状況で若干手詰まりです。
三重ループを経験されている方にお知恵を拝借したく存じます。

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

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

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

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

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

guest

回答2

0

ベストアンサー

rangeメソッドの内容など詳細が把握しきれないのですが、現状、itemsの属性としてresultListとopponentListが存在しているのですよね?

items
├resultList
└opponentList

opponentListが勝敗の結果だとしたら、それをresultListの属性とすることはできないのですか?
(jsonの属性に配列が設定できることは把握されていますか?)

APIから返却する時点でそのように加工してもよいですし、それが無理であればJavaScript内でも加工できると思います。

items
└resultList
_└opponentList

JavaScript

1resultList[0]:{ 2avg:0.4195 3draw:0 4era:4.5454545 5gameCount:11 6leagueId:35 7lose:2 8opponent:null 9percentage:0.8182 10points:38 11rank:null 12shortName:"A" 13teamId:3 14teamName:"A" 15win:9 16opponentList:[]//←ここに配列の属性を追加、従来のoppenentListとする 17} 18

そうすると例えば次のように記述できませんか。(range関数も工夫すれば不要のように感じます)

JavaScript

1 <tr ng-repeat="resultList in items.resultList"> 2 <th>{{$index+1}}</th> 3 <td>{{resultList.teamName}}</td> 4 <td>{{resultList.gameCount}}</td> 5 <td>{{resultList.win}}</td> 6 <td>{{resultList.lose}}</td> 7 <td>{{resultList.draw}}</td> 8 <td>{{resultList.percentage | number:3}}</td> 9 <td>{{resultList.points}}</td> 10 <td>{{resultList.avg | number:3}}</a></td> 11 <td>{{resultList.era | number:2}}</a></td> 12 <div ng-repeat="i in range($parent.items.length)"> 13 <td ng-repeat="opponentList in resultList .opponentList"> 14 {{opponentList.win}}-{{opponentList.lose}}({{opponentList.draw}})</div> 15 </td> 16 </div> 17 </tr>

もし的を外していたらすみません。

投稿2017/08/16 15:13

編集2017/08/16 15:33
akabee

総合スコア1947

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

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

退会済みユーザー

退会済みユーザー

2017/08/17 10:38

非常に参考になりました。ありがとうございます。 jsonで配列を指定できるのは盲点でした。 データ的に総当たりといっても対戦漏れがあるデータなので想定よりループ数が少なくなってしまって空データを作るのに苦労しています。
akabee

2017/08/18 00:12

参考になったようで良かったです。 jsonはデータ構造がかなり柔軟に設定できますので、ある程度データ構造を考慮すれば乗り越えられることは多いです。 対戦漏れですか、厄介ですね。 私なら、想定されるべき最大数の対戦のデータは予め作成しておき、対戦していないデータには値を入れず、値の入っていないデータは対戦漏れと扱うような制御を考えます。(総当たりした場合に存在すべきデータがチームによって無い場合があったり、対戦数がチームによってバラバラな場合などは制御が厄介になりそうですので)
guest

0

自分がangular1で開発していた頃は以下の方法でindexを予め指定できていた記憶です。

html

1<div ng-repeat="( index_1, data_1 ) in list_1"> 2 <div ng-repeat="( index_2, data_2 ) in list_2"> 3 {{index_1}} : {{index_2}} : {{data_2.some_key}} 4 </div> 5</div>

上記の方法で問題なければ、この方法で親の親でも問題なくindexが指定できるかと思います。

投稿2017/08/17 01:35

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問