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

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

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

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

Q&A

解決済

2回答

2909閲覧

配列ライクなオブジェクトの連結のためArray.prototype.push.applyを使っているが、IEで動かない

yuri_aj

総合スコア11

JavaScript

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

0グッド

0クリップ

投稿2016/12/20 06:59

編集2016/12/21 07:50

配列ライクなオブジェクトを Array.prototype.push.apply で結合しています。
Firefoxでは動いていますが、IEで動きません。
何か代替方法があるでしょうか。

indexOf が IE で動かなくて、ウェブサイトに自分でコーディングする方法が多数掲載されていたので、
そちらを参照して対応したのですが、Array.prototype.push.apply については情報ないですよね。。。

該当するソースを抜き出してというのが難しいので、ひとまず、オブジェクトをJSON.stringifyで変換したものを下に記します(firefoxでの動作)。

  • JSON.stringify(オブジェクト1)

{"0":{},"length":1,"prevObject":{"0":{"jQuery183005384515478961538":269},"length":1,"prevObject":{"0":{"jQuery183005384515478961538":268},"context":{"jQuery183005384515478961538":268},"length":1},"context":{"jQuery183005384515478961538":268},"selector":".parent()"},"context":{"jQuery183005384515478961538":268},"selector":".parent() div.datagrid-view1 table.datagrid-btable tr[style*="background-color:"]"}

  • JSON.stringify(オブジェクト2)

{"0":{},"length":1,"prevObject":{"0":{"jQuery183005384515478961538":318},"length":1,"prevObject":{"0":{"jQuery183005384515478961538":317},"context":{"jQuery183005384515478961538":317},"length":1},"context":{"jQuery183005384515478961538":317},"selector":".parent()"},"context":{"jQuery183005384515478961538":317},"selector":".parent() div.datagrid-view1 table.datagrid-btable tr[style*="background-color:"]"}

  • Array.prototype.push.apply(オブジェクト1,オブジェクト2)で連結した後のオブジェクト1

{"0":{},"1":{},"length":2,"prevObject":{"0":{"jQuery183005384515478961538":269},"length":1,"prevObject":{"0":{"jQuery183005384515478961538":268},"context":{"jQuery183005384515478961538":268},"length":1},"context":{"jQuery183005384515478961538":268},"selector":".parent()"},"context":{"jQuery183005384515478961538":268},"selector":".parent() div.datagrid-view1 table.datagrid-btable tr[style*="background-color:"]"}

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

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

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

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

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

guest

回答2

0

ベストアンサー

Array.prototype.push.apply

IE で動かない理由は特にないと思います。
下記コードを IE で実行したらどうなりますか。
また、IE のバージョンも明らかにしてください。

Array.prototype.indexOf, String.prototype.indexOf

indexOf が IE で動かなくて、ウェブサイトに自分でコーディングする方法が多数掲載されていたので、

Array.prototype.indexOf, String.prototype.indexOf のどちらですか。
何がどう動かないのか、コードを出して明らかにしてください。

String.prototype.indexOf は ES3 当時から古いAPIなので IE で使えないという事はないはずです。
Array.prototype.indexOf は IE9+ で使用できます。

Re: yuri_aj さん

投稿2016/12/20 07:08

編集2016/12/20 09:42
think49

総合スコア18162

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

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

yuri_aj

2016/12/20 09:19

ご提示いただいたコードをIEで実行したら、うまくいっております。 使用しているIEのバージョンは11です。 indexOfについては、Array.prototype.indexOfです。 ちなみにですが、配列ではなくて、配列ライクなオブジェクトです。 不慣れで、自分のソースを公開できる形式で準備できましたら提示させていただきます。
think49

2016/12/20 09:45 編集

To: yuri_aj さん Array.prototype.push, Array.prototype.indexOf は意図的に汎用的に動作するよう仕様で規定されているので、それ(this値)が配列でなくとも動作するはずです。 こちらで検証したところでは「length の存在しない疑似配列」を与えると IE11 で期待通りに動作しませんでしたが、正しい length を与えてやれば期待通りに動作しました。親記事を修正済。 https://jsfiddle.net/zoyth6Lv/1/ https://jsfiddle.net/zoyth6Lv/3/
yuri_aj

2016/12/21 07:47

おっしゃるような「lengthの存在しない擬似配列」?のようです。 どうやったらいいのかわかりませんが、試行錯誤しているところです。
think49

2016/12/21 08:48

To: yuri_aj さん 簡易的にでいいので再現可能なコードを出してほしかったところです。こちらでコードを組み立てるのに少し時間がかかったので出来るだけそちらで再現な能なミニマムコードまで作っていただけると助かります。 https://jsfiddle.net/j3zc39a7/ にてIE11 で期待通りに動作しました。 ところで、jQueryオブジェクトには jQuery#add があったと思います。 pushやconcatがないのは不便ではありますが、for文でaddを繰り返しても実装可能ですね。 https://api.jquery.com/add/
yuri_aj

2016/12/22 04:30

ご提示いただいたコードでIEでもFirefoxと同様に動いたということは、やっぱり動作しないのは、他に原因がありそうです。 タイトルの疑問については、おかげさまで解決されたようですので、これでクローズとさせていただこうと思います。 ソースをご提示できないままで、お手数をおかけしました。ありがとうございました。
guest

0

こういった感じでできました。

html

1<p class="test1"></p> 2<p class="test1"></p> 3<p class="test1"></p> 4<p class="test2"></p> 5<p class="test2"></p> 6<p class="test2"></p> 7

javascript

1var test1 = document.querySelectorAll('.test1'); 2var test2 = document.querySelectorAll('.test2'); 3 4var arr1 = Array.apply(null, test1); 5var arr2 = Array.apply(null, test2); 6[].push.apply(arr1, arr2); 7 8console.log(arr1); // [p.test1, p.test1, p.test1, p.test2, p.test2, p.test2 ]

投稿2016/12/20 10:49

yamato_hikawa

総合スコア2092

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

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

yuri_aj

2016/12/21 00:50 編集

自分のソースに反映させ、firefoxでは動作しましたが、IEでは動作しませんでした。
yamato_hikawa

2016/12/21 05:51

こちらもIE11で確認した所、上のソースではちゃんとarr1が書き換わっており、動作していました。 何か別の原因があるのではないでしょうか。
yuri_aj

2016/12/21 08:03 編集

別の原因であることも視野に入れて調査中です。 情報が少ない中、回答いただきまして、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問