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

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

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

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

3205閲覧

each文で前の値を次の値に加算していく処理

Gr.

総合スコア89

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2018/10/16 09:41

viewでこんな感じのテーブルを作ろうと思います。
(TotalカラムにCountカラムの数値を加算していく。)

No.CountTotal
11010
23040
32060
450110
510120

@count = [[1,10],[2,30],[3,20],[4,50],[5,10]]
よくわからないので、とりあえずviewにこう書きます。

<table> <tr> <th>No.</th> <th>Count</th> <th>Total</th> </tr> <% @count.each do |f| %> <tr> <td><%= f[0] %></td> <td><%= f[1] %></td> <td><%= f[1] %></td> </tr> <% end %> </table>

結果:

No.CountTotal
11010
23030
32020
45050
51010

一旦このようにして、あとはスクリプトでtotalセルの値をいじればいいのかなと考えました。

考え方:
0. totalのセルをまとめて取得
0. 変数に初期値を設定
0. 今のセルの値を変数に入れる
0. セルの値を保存して次に渡す
0. 今のセルの値に前のセルの値を足す
0. セルの値を保存して次に渡す…

教えていただきたいこと

まず、上記の考え方で正しいのか(実現できるのか)が知りたいです。
そして、この場合のスクリプトの書き方が具体的に知りたいです。←初心者なので特にここを教えていただきたいです
あと、他に効率よく上記のテーブルを作る方法があったら知りたいです。

よろしくお願いいたします。

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

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

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

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

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

yambejp

2018/10/16 09:45

なにで処理したいのでしょうか?js,rubyそれともSQL?
guest

回答2

0

ベストアンサー

こんなRubyコードでも配列が取得できます。

ruby

1counts = [[1, 10], [2, 30], [3, 20], [4, 50], [5, 10]] 2 3counts.each_with_object([]).with_index do |((_id, count), sum), index| 4 sum << (sum[index-1] || 0) + count 5end 6 7=> [10, 40, 60, 110, 120]

投稿2018/10/16 15:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Gr.

2018/10/16 23:27

alpさん 回答ありがとうございます! そんなやりかたがあったのですね!勉強になります。 この方法でうまくいきました! 1つわからないのですが、 sum << (sum[index-1] || 0) + count この部分はつまりどういうことなのでしょうか?
退会済みユーザー

退会済みユーザー

2018/10/17 00:28 編集

sum配列に足し合わせた値を追加しています。 (sum[index-1] || 0) は、一つまえのsum配列の値を取得しています。 nilの場合は0を使うようにしています。 ------------ 1回目のループ _id: 1 count: 10 index: 0 sum[index-1]: nil ------------ 2回目のループ _id: 2 count: 30 index: 1 sum[index-1]: 10 ------------ 3回目のループ _id: 3 count: 20 index: 2 sum[index-1]: 40 ------------ 4回目のループ _id: 4 count: 50 index: 3 sum[index-1]: 60 ------------ 5回目のループ _id: 5 count: 10 index: 4 sum[index-1]: 110
Gr.

2018/10/17 10:59

「nilの場合は0を使う」。この部分がわかりませんでしたが、おかげさまで理解できました! ありがとうございました!
guest

0

jQuery版

javascript

1<script> 2$(function(){ 3 $('#t1 td').each(function(x){ 4 if(x>3 && x%3==2){ 5 $(this).text($('#t1 td:lt('+x+'):nth-child(3n+2):gt(0)').map(function(){ 6 return parseInt($(this).text()); 7 }).get().reduce(function(p, c){ 8 return p + c; 9 })); 10 } 11 }); 12}); 13</script> 14 15<table id="t1"> 16<tr><td>No.</td><td>Count</td><td>Total</td></tr> 17<tr><td>1</td><td>10</td><td></td></tr> 18<tr><td>2</td><td>30</td><td></td></tr> 19<tr><td>3</td><td>20</td><td></td></tr> 20<tr><td>4</td><td>50</td><td></td></tr> 21<tr><td>5</td><td>10</td><td></td></tr> 22</table>

調整版

前回すこしロジックがくどかったので調整しました

javascript

1$(function(){ 2 $('#t1 td:nth-child(3n):gt(0)').each(function(){ 3 var idx=$('#t1 td').index(this); 4 var v1=parseInt($('#t1 td').eq(idx-1).text()); 5 var v2=parseInt($('#t1 td').eq(idx-3).text())|0; 6 $(this).text(v1+v2); 7 }); 8});

※解説

  • 「$('#t1 td:nth-child(3n):gt(0)')」:テーブルの2列目の2行目以降のtdをとる
  • idxにそのtdのテーブル全体におけるインデックスを取る
  • v1に自分の前の列のtdの値をとる
  • v2に自分の上の行のtdの値をとる、その際parseIntがNaNだったときは0を返す
  • 自分のtdの値をv1とv2の和とする

投稿2018/10/16 10:43

編集2018/10/17 00:45
yambejp

総合スコア114769

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

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

Gr.

2018/10/16 11:30

yambejpさん 回答ありがとうございます! 情報足りなくて失礼いたしました。jQuery版で大丈夫です。 if(x>3 && x%3==2){ の箇所や $(this).text($('#t1 td:lt('+x+'):nth-child(3n+2):gt(0)').map(function(){ の箇所など、 自分のレベルではとても複雑に思えるコードで、解説をいただきたいのですがよろしいでしょうか。 簡単にでもいいので、上から全体的に説明していただけると助かります。 お手数おかけしてすみません。
yambejp

2018/10/17 00:46

ちょっとくどかったので調整版をあげて解説をつけておきました
Gr.

2018/10/17 11:03

調整版と解説の追記、ありがとうございました! 勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問