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

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

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

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

Q&A

解決済

1回答

2738閲覧

オブジェクト型の結果は返ってくるが、それをlengthで要素数を数えると未定義になる。

yajin

総合スコア75

jQuery

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

1グッド

0クリップ

投稿2016/09/20 02:11

編集2016/09/20 06:06

console.log(words)は複数の検索語の結果が返ってくるが、
var len = words.length;
console.log(len);をすると未定義になる。

なぜでしょうか。

js

1 }).done(function (words) { 2 $(".ajaxregisteredresult").empty(); 3 console.log(words); 4 var len = words.length; 5 console.log(len); 6 for(var i=0; i < len; i++){ 7 $(".ajaxregisteredresult").append('<option value="' + words[i]["registered"] +'">'); 8 }

lenの方は、undefinedがあらわれます。
どうしてでしょうか。

イメージ説明

js

1$(function() { 2 $('.search_box').on("keyup",function(){//keyup時 3 4 var words = new Object(); 5 $.ajax({ 6 url: "/words/registered.json", 7 type: "post", 8 dataType: "json", 9 data : { 10 words : $(".search_box").val() 11 } 12 }).done(function (words) { 13 $(".ajaxregisteredresult").empty(); 14 console.log(words); 15 words_arr = words.toArray(); 16 var len = words_arr.length; 17 console.log(len); 18 for(var i=0; i < len; i++){ 19 $(".ajaxregisteredresult").append('<option value="' + words[i]["registered"] +'">'); 20 } 21 }).fail(function (data) { 22 console.log("エラーだよ"); 23 }); 24 }); 25}); 26
mtdsnsk👍を押しています

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

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

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

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

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

kunai

2016/09/20 02:21

wordsがなんなのか見せていただけませんか。 コールバックのようですので、そのコールバックが呼ばれるところも含めていただけると助かりますが
guest

回答1

0

ベストアンサー

Array.isArray

「配列ではないから」ではないでしょうか。

JavaScript

1console.log(Array.isArray(words));

length プロパティ

length を扱える Object 型は配列の他にもいくつかありますが、length が規定されたものでしか扱えず、Object 型全般で扱えるプロパティではありません。

  • 配列
  • NodeListのインスタンス
  • HTMLCollectionのインスタンス

words が直属で持つプロパティの数を数える事が目的なら下記コードで参照可能です。

JavaScript

1Object.keys(words).length

Re: Re: yajin さん

投稿2016/09/20 02:18

編集2016/09/20 02:48
think49

総合スコア18162

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

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

yajin

2016/09/20 02:25

console.log(Array.isArray(words)); falseが返ってきます。 lengthって配列型ではないと使えないのでしょうか。
think49

2016/09/20 02:48 編集

親記事に追記しました。
yajin

2016/09/20 02:57

ありがとうございます。 console.log(words); var len = Object.keys(words).length; console.log(len); とやると、6個データがあるものの、console.log(len)は1と出ます。
think49

2016/09/20 03:03 編集

SSみましたが、 words = {words:[{},{},{},{},{},{}]} のように読めます。 words は一つしかプロパティを持っていないのではないでしょうか。 (答えはわかりますが、自分で考えてほしいのであえて書きません)
yajin

2016/09/20 03:31

$(".ajaxregisteredresult").empty(); console.log(words); var len = 0; for (var i in words["id"]){ len++; } console.log(len); for(var i=0; i < len; i++){ $(".ajaxregisteredresult").append('<option value="' + words[i]["registered"] +'">'); } 近づいたでしょうか。
think49

2016/09/20 03:59

To: yajinさん 残念ながら、遠のいたと思います。 words["id"] === undefined なので len === 0 になります。 console.log(words['id']); console.log(len); でコンソールデバッグしてみてください。 毎回、ajaxをすると時間がかかるので、 console.log(JSON.stringify(words)); して出力されたオブジェクト初期化子を元に目的の値を参照するまでトライアンドエラーを繰り返してみるといいと思います。 多次元配列や多次元オブジェクト的な考え方が必要になります。 https://www.google.co.jp/search?num=30&q=%E5%A4%9A%E6%AC%A1%E5%85%83%E9%85%8D%E5%88%97+javascript https://www.google.co.jp/search?q=javascript+%E5%A4%9A%E6%AC%A1%E5%85%83%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88 To: kei344 さん 補足ありがとうございます。
yajin

2016/09/20 04:06 編集

wordsオブジェクトの中にwordsという配列名があり、その中の要素を数えるという考え方でいいんですよね?
yajin

2016/09/20 04:12

var len = 0; for (var i in words["words.registered"]){ len++; } console.log(len);
yajin

2016/09/20 04:19

var len = 0; // for (var i in words.words){//208 //for (var i in words.words["registerd"]){//0 //for (var i in words["words"]["registered"]){//0 for (var i in words.words["id"]){ len++; } console.log(len); 方向性はこのような形でいいのでしょうか。
think49

2016/09/20 05:00

To: yajinさん > wordsオブジェクトの中にwordsという配列名があり、その中の要素を数えるという考え方でいいんですよね? そうです。 for-in 文は使いません。 配列を回すのは for 文か Array.prototype.forEach です。 配列を変数に格納することを意識してみてください。
yajin

2016/09/20 05:39

多次元配列であることはわかっているのですが、できません。 例題みたいなものを頂けますか?
yajin

2016/09/20 06:04

要素すらアクセスできません・・・・。 この後も色々と仕事があるので、例題を頂ければ幸いに存じます。
kei344

2016/09/20 06:10

var a = { b : 'text' }; console.log( a.b ); // 'text' var c = { d : [] }; console.log( c.d ); // []
yajin

2016/09/20 06:15

すみません。それはわかります。
think49

2016/09/20 06:30 編集

kei344さんの例題が分かるならそのまま答えに繋がると思うのですが…。 特に c.d は今回のコードと同じですよね? for 文で配列を列挙する部分が分からないのでしょうか。 for (var i = 0, l = d.length; i < l; ++i) { console.log(d[i]); }
think49

2016/09/20 06:36

var d = [{id: 1, value: 'hoge'}, {id: 2, value: 'foo'}, {id: 3, value: 'piyo'}]; for (var i = 0, l = d.length; i < l; ++i) { console.log(d[i]); console.log(d[i].id); console.log(d[i].value); }
yajin

2016/09/20 06:42

var words_arr = words.words; console.log(words_arr[0]); とすると、 [ という結果しか返ってきません。
think49

2016/09/20 06:49 編集

状況を知りたいので console.log(JSON.stringify(words)); の結果を質問文にコードブロックで括って追記して下さい。 > [ > という結果しか返ってきません。 "[" の後は何でしょうか。
yajin

2016/09/20 06:50

```コードブロック? {"words":"[{\"id\":216,\"registered\":\"Absalom\"},{\"id\":217,\"registered\":\"abscess\"},{\"id\":218,\"registered\":\"Abschied\"},{\"id\":219,\"registered\":\"absconded\"},{\"id\":220,\"registered\":\"absence\"},{\"id\":221,\"registered\":\"Absence\"}]"} ```
yajin

2016/09/20 06:52

var words_arr = words.words; console.log(words_arr[1]); は、 { が出てきています。文字列が1文字ずつ分割されてでてきます。 よって、words.words.lengthに関しては、その文字数全体が取得されている状況です。
think49

2016/09/20 06:57

なるほど。合点がいきました。 words.words は「JSON文字列」なんですね。 var words_arr = JSON.parse(words.words); console.log(words_arr[0]); > ```コードブロック? それで合っていますが、コメントではmarkdown記法が利かないので質問文に編集して追記してくれることを期待していました。
think49

2016/09/20 07:00

おそらく、上のコメントで解決可能ですが、問題が一つ。 元々、jQueryで JSON を Object 型にパースしているはずですが、パースした結果のオブジェクトにも更に JSON が入っています。 JSON.stringify を2回実行していることになり、これは無駄なフォーマットになってしまっていると思います。 JSONを生成するコードに問題がありそうですので見直すことをお勧めします。
yajin

2016/09/20 07:17

var words_arr = JSON.parse(words.words); // console.log(words_arr[0]["registered"]); i = 0; $.each(words_arr, function(){ $(".ajaxregisteredresult").append('<option value="' + words_arr[i]["registered"] +'"></option>'); i++; } ) でまずは動きました。
yajin

2016/09/20 07:28

色々と細かいところチェックしてました。 ブラウザでは使えたのですが、iPhoneでは<datalist>タグは使えないのでしょうか。 iPhoneでは動いてません。GoogleChromeでもoperaでももちろん動きます。
yajin

2016/09/20 07:30

http://caniuse.com/#feat=datalist あー使えないんですね・・・。 ほんと助かりました! 誠にありがとうございます!!! 後日細かい点を修正していきます。キーワードがわかったのでちょっとまた勉強してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問