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

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

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

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

jQuery

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

Q&A

解決済

4回答

3230閲覧

クラスを回してテキストの数値を合計する。

tkshp

総合スコア174

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2019/03/25 04:08

編集2019/03/25 04:39

前提・実現したいこと

テーブルの各セルに共通クラスを持たせて、そのクラスで回して、各セルの合計値を取得する方法のご教示をお願い致します。
エラー解決方法を知りたい為、eachメソッドのvalを使って、各セルのテキストの値を取得する方法を知りたいです。

該当のソースコード

html

1 <table> 2 <tr> 3 <td class = "sample">10</td> 4 <td class = "sample">20</td> 5 <td class = "sample">30</td> 6 </tr> 7 </table>

試したこと

$(function(){ var sample = $(".sample"); var sum; sample.each(function(index, val){ console.log(val); sum += val.text(); }); console.log("sum:"+sum); });

・エラーメッセージ。

Uncaught TypeError: val.text is not a function at HTMLTableCellElement.<anonymous>

valを出力したら、

<td class="sample">10</td> となるので、 これで何故、val.text()でエラーが出てしまうのかわかりません。

追記

現状の全コードです。

html

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>sample page</title> 6<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> 7<script src="sample01.js"></script> 8<!-- <link rel="stylesheet" type="text/css" href="sample01.css"> --> 9</head> 10<body> 11 <table> 12 <tr> 13 <td class = "sample">10</td> 14 <td class = "sample">20</td> 15 <td class = "sample">30</td> 16 </tr> 17 </table> 18</body> 19</html>

JavaScript

1$(function(){ 2 var sum; 3 $(".sample").each(function(index, val){ 4 console.log($(val).text()); 5 sum += parseInt($(val).text(), 10); 6 }); 7 console.log(sum); 8});

・出力結果。

10 20 30 NaN

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

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

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

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

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

guest

回答4

0

val.text()関連はほかの回答者さんが回答してくれているので、NaNになるところだけ回答します。


結論からいうとsumを初期化していないのが原因です。

$(function(){ var sum; $(".sample").each(function(index, val){ console.log($(val).text()); sum += parseInt($(val).text(), 10); }); console.log(sum); });

↑にあるようにvar sumだけだと初期化されていないのでundefinedが入っている状態になっています。
そしてundefinedにたいして+=しているのでNaNになっているということです。

ですので、var sum = 0のように初期化するとNaNにならなくなります。

投稿2019/03/25 04:50

michael-ilcsy

総合スコア180

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

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

tkshp

2019/03/25 04:53

ご回答ありがとうございます。 なるほど、var sum = 0のように初期化する必要があったのですね。 解決しました。 ありがとうございました。
michael-ilcsy

2019/03/25 04:59

私は他の回答者さんに付け足しただけの回答なのでBAは他の方のほうが個人的には有難いです。
tkshp

2019/03/25 05:05 編集

ご回答ありがとうございます。 お気遣いありがとうございます。 それでは、他の回答者様にベストアンサーを移させていただきたいと思います。 ありがとうございました。
m.ts10806

2019/03/25 05:08

今回は変数の初期化が正しく行われなかったことが最も大きな問題だと思いますので(私も途中で気づきました)、そういった意味ではこちらがベストアンサーとしては相応しいと思ってます(あくまで私個人の感覚なので質問者さんにお任せしますが)
m.ts10806

2019/03/25 05:08

と書いてたら変わってた。 いずれにしても解決につながったようで良かったです。
guest

0

ベストアンサー

valを出力したら、

<td class="sample">10</td>

はい、これは単なる文字列です。
text()はあくまでjQueryの要素に対して使えるものなので

js

1sum += $(val).text();

のようにきちんとjQueryの要素として扱う必要があります。

ただし、これでも実際に取得されるのは文字列です。
このままだと102030のように文字列連結されるだけになると思います。

「足し算を行いたい」のであればparseInt()を利用して文字列→数値の変換を行ってください。

投稿2019/03/25 04:17

編集2019/03/25 04:18
m.ts10806

総合スコア80850

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

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

tkshp

2019/03/25 04:24

ご回答ありがとうございます。 sum += $(val).text(); で出力すると、 何故か、 sum:undefined102030 というふうにundefinedが出てきてしまって、そのせいか、 sum += $(val).text().parseInt(); だとエラーになってしまいます。 ご教示いただけませんか?
m.ts10806

2019/03/25 04:26

parseInt() ちゃんと見ましたか? 私はマニュアルへのリンクを貼ってます。
tkshp

2019/03/25 04:35

大変失礼しました。 見てませんでした。 拝見しました。 $(function(){ var sum; $(".sample").each(function(index, val){ console.log($(val).text()); sum += parseInt($(val).text(), 10); }); console.log(sum); }); で出力すると、NaNになってしまうのですが、 parseIntの書き方をご教示いただけませんか? 10 20 30 NaN
m.ts10806

2019/03/25 04:48 編集

マニュアル、リファレンスは仕様ですのでどのような個人ブログや記事よりも確実な情報が載っています。何かあったときにはマニュアルです。 そういえば、parseInt()の第2引数にあててる「10」ってどういう意図があってつけました?
m.ts10806

2019/03/25 04:50 編集

あと、初期値何も設定しない変数はまずいですよ。 値なしの変数に何を足しても何も無しです。 +=だから、「元の値に足しこむ(文字列の場合は継ぎ足す)」です。 数値型なので余計にその影響が顕著に出ます。
tkshp

2019/03/25 04:56

ご回答ありがとうございます。 すみません、こちらコメントに気づかず、ベストアンサーを他の人に付けてしまいました。 数値の初期化が必要だったのですね。 解決しました。 ありがとうございました。
m.ts10806

2019/03/25 04:58

時間的には僅差ですし具体的なコードを提示したわけではないので 直接の解決策が書いてあるほうに目が行くのは仕方がないことだと思います。 解決されたようで何よりです。
tkshp

2019/03/25 05:03

ご回答ありがとうございます。 そのように仰っていただけて安心しました。 ありがとうございました。
tkshp

2019/03/25 05:07

ベストアンサーをさせていただいた回答者様から、移行のご意思をいただいたので、 改めてベストアンサーにさせていただきました。 ありがとうございました。
guest

0

javascript

1<script> 2window.addEventListener('DOMContentLoaded', function(e){ 3 var v=[].map.call(document.querySelectorAll('.sample'),function(x){ 4 return parseFloat(x.textContent); 5 }).reduce(function(prev,current){ 6 return prev+current; 7 }); 8 console.log(v); 9}); 10</script> 11 12<table> 13<tr> 14<td class = "sample">10</td> 15<td class = "sample">20</td> 16<td class = "sample">30</td> 17</tr> 18</table>

NaN対応

javascript

1<script> 2window.addEventListener('DOMContentLoaded', function(e){ 3 var v=[].map.call(document.querySelectorAll('.sample'),function(x){ 4 return parseFloat(x.textContent)||0; 5 }).reduce(function(prev,current){ 6 return prev+current; 7 }); 8 console.log(v); 9}); 10</script> 11 12<table> 13<tr> 14<td class = "sample">10</td> 15<td class = "sample">20</td> 16<td class = "sample">30</td> 17<td class = "sample">abc</td> 18</tr> 19</table>

投稿2019/03/25 04:33

編集2019/03/25 05:08
yambejp

総合スコア114829

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

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

tkshp

2019/03/25 04:54

ご回答ありがとうございます。 勉強になりました。 ありがとうございました。
guest

0

どういうわけか、jQueryのeachでjQueryオブジェクトを回すと、DOMオブジェクトが渡ってきます(公式)。

なので、

  • 生のDOMにある.textContentでテキストを抽出する
  • jQueryを使いたい場合、$(val).text()のようにjQueryオブジェクトに変換する

といった手段が必要となります。

投稿2019/03/25 04:14

maisumakun

総合スコア145183

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

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

tkshp

2019/03/25 04:18

ご回答ありがとうございます。 $(function(){ var sample = $(".sample"); var sum; sample.each(function(index, val){ console.log(val); sum += $(val).text(); }); console.log("sum:"+sum); }); としたのですが、 sum:undefined102030 という結果になりまして、 何故、undefinedが出てきてしまうのかわからないのですが、 ご教示いただけませんか?
maisumakun

2019/03/25 04:31

この表以外のところに、.sampleクラスの入った要素はありませんか?
tkshp

2019/03/25 04:40

ご回答ありがとうございます。 現状の全コードを追記しました。
tkshp

2019/03/25 04:57

ご回答ありがとうございます。 sumを初期化をしていなかった為、最初にundefinedが付いていたようです。 解決しました。 ご教示ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問