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

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

ただいまの
回答率

90.50%

  • JavaScript

    16948questions

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

  • jQuery

    6908questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,150

tkow

score 1175

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

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

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/05 15:42

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

    キャンセル

+2

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

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

var is_array_ex = function(value) {
    return value &&                             
        typeof value === 'object' &&
        typeof value.length === 'number' &&
        typeof value.splice === 'function' &&
        !(value.propertyIsEnumerable('length'));
}


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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/05 15:54

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

    キャンセル

+2

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

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

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


これなら、配列も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/06 10:17

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

    キャンセル

+2

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

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

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

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

Re: tkow さん

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/06 10:20

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

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    16948questions

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

  • jQuery

    6908questions

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