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

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

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

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

jQuery

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

Q&A

解決済

4回答

3199閲覧

jQueryの配列など,Object型と判定されるものを配列と判定したい。

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2016/04/05 06:33

毎度お世話になっております。

現在,配列に入っている配列を全て展開し,全ての要素を配列一個だけにするという処理を実装しています。

javascript

1var a =[[1],[2,3,[4,5],6],7,],8,[9,10]]; 2function convert(array){}; 3convert(a); 4//#=>[1,2,3,4,5,6,7,8,9,10]

こちらビルトイン配列に関しての実装は完了したのですが,jQueryの配列を展開しようとしたところインデックスiの時の要素がjQueryのセレクタで得られた配列をArray.isArray(a[i])で実行すると,falseが返り配列に対して実行したい処理がスルーされてしまいます。

これらのオブジェクトを配列とみなす方法として,length要素などのプロパティが存在するかどうかなどで判別できると思いますが,他に良い方法はあるでしょうか?

また,このように同じ[]を利用しているのに別オブジェクトとして定義するという実装は,どのように実装しているのでしょうか。jQueryの実装に詳しい方いらっしゃいましたらお聞きしたいです。

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

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

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

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

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

guest

回答4

0

jQuery オブジェクトを判定するなら instanceof 演算子がお手軽だと思います。

JavaScript

1console.log(jQuery('p') instanceof jQuery); // true 2console.log(Object.getPrototypeOf(jQuery('p')) === jQuery.prototype); // true

個人的には Array.from で配列に変換する実装で十分な気がします(IE11- 対策として Polyfill は必須ですが)。

JavaScript

1console.log(Array.from(jQuery('p'))); 2console.log(Array.prototype.slice.call(jQuery('p'))); 3console.log(Object.assign([], jQuery('p')));

Re: tkow さん

投稿2016/04/05 13:30

think49

総合スコア18164

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

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

退会済みユーザー

退会済みユーザー

2016/04/06 01:20

プロトタイプで判別する方法もあるのですね。 勉強になりました。 jQueryのオブジェクト判定も出来るっていうのも出来るんじゃないかと思っていたことなので出来ることがわかってよかったです。
guest

0

題意から、「配列のように添え字でアクセスできる値を持つオブジェクトを配列とみなして扱いたい」ということかと思ったのですが、皆さんの回答で納得されてるようなので蛇足をば。

基本的に「添え字でアクセスできる」「配列とみなして扱う」ということで、数値型のプロパティを持ってれば「配列とみなして」扱ってしまうことにしてみましょう。
※連想配列の場合は無視することにします。

javascript

1var getNumericalKeys = function(object){ 2 var keys = []; 3 for(key in object){ if(!isNaN(key)){ keys.push(key); } 4 return keys; 5};

これなら、配列もjQueryオブジェクトもDOMのNodelistも「配列とみなして」「添え字で値にアクセス」ができます。

var keys; var arr = [1,2,3]; keys = getNumericalKeys(arr); // [0, 1, 2] for(var i = 0; i < keys.length; i++){ console.log(arr[keys[i]]); } keys = getNumericalKeys($('p')); // 略 keys = getNumericalKeys(document.getElementsByTagName('p')); // 略

。。。ついでにmaisumakunさんの回答に出てきた「arrayLike」も配列扱いになりますねw

投稿2016/04/05 11:09

編集2016/04/05 11:14
tkturbo

総合スコア5572

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

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

退会済みユーザー

退会済みユーザー

2016/04/06 01:17

ありがとうございます! jsでインデクサっぽいもの作るとこんな感じになるのですね。 勉強になりました。
guest

0

なかなか、面倒な問題ですよね、、、
配列と、オブジェク・・・JavaScriptの世界では、まあ、いい意味で曖昧というか、でも困りものでもあったり。

さて、本題です。
配列かどうかを、見極めるコードとして有名どころのコードですが、

JavaScript

1var is_array_ex = function(value) { 2 return value && 3 typeof value === 'object' && 4 typeof value.length === 'number' && 5 typeof value.splice === 'function' && 6 !(value.propertyIsEnumerable('length')); 7}

こんなのかと。
いわゆる、おっしゃられている「length」で、判別するという方法をちょっと拡張したものです(lengthだけだと、stringとかも引っかかってしまいますから)。

ということで、以下の記事などが参考になるかと。
http://qiita.com/kyoshiro-obj/items/551240c68185fd47e2fe

http://watilde.hatenablog.com/entry/2012/11/02/163440

投稿2016/04/05 06:50

ItoTomonori

総合スコア1283

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

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

退会済みユーザー

退会済みユーザー

2016/04/05 06:54

なるほど! ありがとうございました!
guest

0

ベストアンサー

jQueryオブジェクトのようなオブジェクトを、専門的には「配列のようなオブジェクト」といいますが、要はただのオブジェクトです。

たとえば、以下のように、単なるオブジェクトにも数値プロパティを追加できます。

javascript

1var arrayLike = {}; 2arrayLike[0] = 2; 3arrayLike[1] = 3;

「配列のようなオブジェクト」を本物の配列に直すのによく使われるArray.prototype.sliceも、lengthと数値プロパティさえあれば何でも受け入れるようになっています。

投稿2016/04/05 06:41

maisumakun

総合スコア145184

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

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

退会済みユーザー

退会済みユーザー

2016/04/05 06:42

ありがとうございます! 助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問