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

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

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

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

jQuery

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

Q&A

解決済

3回答

5001閲覧

jQueryでの配列出力

sbc

総合スコア21

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2017/04/10 02:56

編集2017/04/10 05:00

###前提・実現したいこと
・前提
POST送信用フォーム:Form
Formの中にある「詳細フィールド(textarea)」:Textarea
Formと同じ画面内にある別フォームModal:Modal
Modalの中身:ラジオボタン・text・セレクトリスト

・実現したいこと
Modalにて設定した項目・内容をTextareaに出力したい。

###わからないこと
出力処理のeachに入らず、出力されない

###該当のソースコード

function output() { // Textareaへの出力用配列 var output = []; // radioButton のラベルタイトル output['radioButton'] = radioButton.text() // 複数選択selectboxで選択されている値(text) var selectedText = [];
$selected = $Field_2.find('#selected option:selected');
$selected.each(function () {
 selectedText.push($(this).text());
}); // 普通のtext output['string'] = string.text() // 出力箇所 $.each(output, function (key, text) {
 $('#textarea').append(key + ' : ' + text + "\n");
});

###試したこと
Modal内の各要素を配列化することはできている。

[追記]
・each直前のoutputの中身

output: Array[0]

radioButtn:"らじお"

length:0
selected:Array0
string:"てきすと"


###試したこと2

function output() { // Textareaへの出力用配列 var output = []; // radioButton のラベルタイトル output.push({'radioButton' : radioButton.text()} ); // 複数選択selectboxで選択されている値(text) var selectedText = [];
$selected = $Field_2.find('#selected option:selected');
$selected.each(function () {
 selectedText.push($(this).text());
}); output.push({'selected' : selectedText}); // 普通のtext output.push({'string' : string.text()}); // 出力箇所 $.each(output, function (key, text) {
 $('#textarea').append(key + ' : ' + text + "\n");
});

・結果
出力はされているがキーが配列番号になってしまう。
0:[object Object]
1:[object Object]
2:[object Object]
3:[object Object]

###試したこと3
試したこと2 の最後のeach部分を以下のように修正。

var result = $('#textarea').val();
$.each(output, function (key, object) {
 $.each(object, function (title, text) {
 if (result[title] !== '') {
 result += (title + ':' + text + '\n');
 }
 })
});
$('#textarea').val(result);

・結果
title : text
title : text
title : text
title : text
期待した結果にはなったが、もっとスマートな方法はありますでしょうか。

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

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

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

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

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

kei344

2017/04/10 03:04

何がわからないか、エラーは出ていないのか、出力できているなら結果はどうなっているかなど、具体的に質問文に追記いただいたほうが回答を得られやすいと思います。また、状況の再現が可能なHTML/JavaScriptを質問文に追記ください。
kei344

2017/04/10 05:03

「もっとスマートな方法」とは、どのあたりを持って「スマートで無い」という判断をしたのかを具体的に追記ください。
guest

回答3

0

ベストアンサー

jQuery.each

出力はされているがキーが配列番号になってしまう。

jQuery.each の動作は特殊で第一引数の内容によって処理を変えます。
https://api.jquery.com/jQuery.each/

  • 第一引数が「配列」なら Array#forEach 相当の動きをします(key: 0, 1, 2,...)
  • 第一引数が「配列以外のオブジェクト」なら Object.entriesArray#forEach する動きをします

この場合、第一引数は配列なので forEach 相当の動きとなり、期待通りに動作しません。

配列初期化子とオブジェクト初期化子

そもそも、配列を拡張して任意のキーを持たせるのは使い方が間違っています。
改善するにはオブジェクト初期化子({})か new Map を使用して下さい。
append されない問題は maisumakun さんが指摘された通り、.val() を使えば解消出来ます。

二次元配列

先述のオブジェクト初期化子も new Map も使用していませんが、二次元配列でも同様の処理が可能です。

JavaScript

1var output = [['radioButton', radioButton.text()], ['selected', jQuery('#selected>option:selected').text()], ['string', selectedText]]; 2jQuery('#textarea')[0].value = output.map(function (entry) { return entry.join(': '); }).join('\n');

ただ、key名を手打ちしているのがエレガントさに欠けます。
スマートに書くなら既存のform関連要素からkey/valueを機械的に読み取る機構が必要だと思います。
yambejp さんが提案される FormData はその一つですね。
勿論、自前で組んでもいいと思います。

Re: sbc さん

投稿2017/04/10 14:10

編集2017/04/10 14:50
think49

総合スコア18162

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

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

sbc

2017/04/11 00:16

ご丁寧な説明ありがとうございます。 .eachの引数によって処理が変わることは存じ上げませんでした。 objectにすることによって解決致しましたのでこちらをベストアンサーとさせて頂きます。
guest

0

$(...).append()にHTMLでない文字列を渡すと、それはセレクタとみなされてしまいます。まとめて.val()でセットするほかないです。

javascript

1// 前略 2 3var result = $('#textarea').val(); 4$.each(output, function (key, text) {
 result += (key + ' : ' + text + "\n");}); 5$('#textarea').val(result);

投稿2017/04/10 03:05

maisumakun

総合スコア145183

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

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

0

モダンなブラウザであればFormDataから抜いたほうがラクかもしれませんね

HTML

1<script> 2function myfunc(){ 3 var f1=new FormData(document.getElementById('f1')); 4 var ta1=document.getElementById('ta1'); 5 ta1.value=""; 6 f1.forEach(function(i,j){ 7 ta1.value+=j+":"+i+"\n"; 8 }) 9} 10</script> 11<form id="f1"> 12hoge:<input type="text" name="hoge" value="123"><br> 13fuga:<input type="radio" name="fuga" value="1">:1 14<input type="radio" name="fuga" value="2">:2 15<input type="radio" name="fuga" value="3" checked>:3<br> 16piyo:<input type="checkbox" name="poyo" value="1" checked>:1 17<input type="checkbox" name="poyo" value="2">:2 18<input type="checkbox" name="poyo" value="3" checked>:3<br> 19hogera:<select name="hogera"> 20<option value="">---</option> 21<option value="x">x</option> 22<option value="y">y</option> 23<option value="z">z</option> 24</select> 25</form> 26 27<form> 28<textarea id="ta1" style="height:200px"></textarea> 29<input type="button" value="check" onclick="myfunc()"> 30</form>

投稿2017/04/10 03:59

編集2017/04/10 04:02
yambejp

総合スコア114814

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

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

yambejp

2017/04/10 05:13

>Modal内の各要素を配列化することはできている の配列化がきちんとできてないだけでは? FormDataは試されました?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問