No.2ベストアンサー
- 回答日時:
かいせつですか…。
コードをかくより めんどうだなぁ…--
Array.map は、ある配列をもとに新たな配列を得るために使われます。
Array.filter は、ある配列の中で、条件を満たしたものを得るために使われます。
--
nodeList = document.getElementsByTagName ('xxx');
nodeList = document.getElementById ('xxx').childNodes;
nodeList = document.form[0].elements;
このように集められるノードリストは、一見すると配列を返しているように思えますが、そうではありません。
配列ではないので Array.map などは使えません。
nodeList.forEach (function (e) { alert (e.tagName); });//このコードは走りません。
--
以後、理解しやすいように勝手に解釈します。map 関数は、内部にある。その関数はきっと
Array.map = map;
のようにして、Array に関連付けられている。普通には呼び出せない。その関数を呼び出す方法が、
Array.prototype.map.call (nodeList, cbFunc);
--
getSison 関数は、ルートノードを引数に渡すと、まずその子ノードリストを順に調べ、それ以下のノードリストを配列として返します。
ary = [ [3,4,5], [6,7], [8], [9,10] ,........ ];
戻り値はきっと上のようになるかもしれない。(子ノードの数で配列の大きさが変化する)
この配列を一気に一つの配列にする方法は、ないものだろうか?
配列をつなげる関数は、concat 。
var ary = [0,1,2].concat ([3,4,5], [6,7], [8], [9,10]); // ary = [0,1,2,3,4,5,6,7,8,9]
map と同じように concat 関数そのものを呼び出すには、
var ary = Array.prototype.concat.call ([0,1,2], [3,4,5], [6,7], [8], [9,10]);
しかし、子ノードの数で concat に渡す引数が変化してしまう。
上の式で言えば、getSison 関数で、root ノードの子ノードは、[[3,4,5], [6,7], [8], [9,10]]のような形で配列になって返される(再帰処理で)。
var child = [[3,4,5], [6,7], [8], [9,10]];
var ary = [root];
var rst = Array.prototype.concat.apply (ary, child);
call ではなく、 apply を使って呼び出すと child の配列の数が何個でも concat 関数の引数として渡される。
つまり、引数として渡された配列は、すべて1つになる。
--
>> var sison = getSison (document.getElementById ('hoge')).filter (isTarget);
の、
getSison (document.getElementById ('hoge'))
は、hoge をルートとする子孫ノードを配列として返す。
[hoge, node0, node1, .....]
このリストから、目的のノードを Array.filter で選別する。
--
で、かいせつに なっているだろうか?
回答ありがとうございました。
>かいせつですか…。コードをかくより めんどうだなぁ…
ごめんなさい……
>で、かいせつに なっているだろうか?
詳細ありがとうございました。ものすごく(解説に)なっています。
大変、勉強になりましたー!
No.1
- 回答日時:
またも、jQuery なんて つかわなくても あつめられます。
しそんノードをあつめて、ひつようなノードだけを はいれつにして かえします。
「削除」のほうは、ひとまかせにします。
Array.map と Array.filter が ひつようです。
<!DOCTYPE html>
<title></title>
<meta charset="UTF-8">
<div id="hoge">
<p>
1<em>2</em>3<br>
4
</p>
<p>
5<br>
6
</p>
</div>
<script>
function isTarget (n) {
return ((3 === n.nodeType) || 'BR' === n.tagName);
}
function getSison (n) {
return n.hasChildNodes ()
? Array.prototype.concat.apply ([n],
Array.prototype.map.call (n.childNodes, getSison))
: n;
}
var sison = getSison (document.getElementById ('hoge')).filter (isTarget);
</script>
この回答への補足
かいとうありがとうございました。
だけど、かいているないようがむずかしいので、かいせつしていただくことはかのうでしょうか?
初めの、
filter (isTarget);
では、「テキストかbrタグだったら、新しい配列を作る」、ということなのでしょうか?
getSison関数に渡された引数に子ノードがあったら、
何をしているのでしょうか?
Array.prototype.concat.apply ([n],???
再び、元の関数を呼んでいるので、
Array.prototype.map.call (n.childNodes, getSison))
再帰処理とかなのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- HTML・CSS HPに文章で改行はすべてBRタグとかで改行しなきゃだめなのですか?改行が活きたまま書く方法ないの? 1 2022/12/03 21:00
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- HTML・CSS 下にスクロールしても、追従するボタンのコードを書いたのですが、ボタンの中の画像が半分しか表示されない 1 2022/04/16 21:31
- Visual Basic(VBA) VBAにてメール作成した際、一部指定箇所のみ赤文字にしたいです。 下記の内容ですと作成されたメール本 1 2022/04/27 13:31
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#テキストボックスの文字を配...
-
jspからjavascriptの変数引継ぎ
-
同じIDで定義した要素の配列を...
-
javascript 変数名の連結をしたい
-
外部csvデータを読み込む(d3.js)
-
WSH(Jscript)でファイル一覧
-
フォーム入力値の重複チェック
-
undefinedを表示させない方法は...
-
javascriptで行を抽出したいです。
-
JavaScriptで2次元配列を扱う方法
-
google apps scriptの終了のさせ方
-
idを使わずにonclickで自身の要...
-
Boolean型配列中のTrueの有無を...
-
JavaScriptで決まった「時刻」...
-
JavaScript window.openで開く...
-
関数でy=g(x)のgとは何の略です...
-
jqGridについて
-
ActiveXobjectが作成できない
-
javascriptのdocument.allにつ...
-
Vb.netのグローバル変数の宣言...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
同じIDで定義した要素の配列を...
-
C#テキストボックスの文字を配...
-
React hooksが値を返して配列変...
-
オブジェクトから任意のプロパ...
-
javascript 変数名の連結をしたい
-
jspからjavascriptの変数引継ぎ
-
配列の1要素を代入した変数を使...
-
JavaScriptにおける[] とか :...
-
フォーム入力値の重複チェック
-
javascriptで行を抽出したいです。
-
undefinedを表示させない方法は...
-
javascriptで2つのArrayの...
-
WSH(Jscript)でファイル一覧
-
JavaScriptでの動的な多次元配...
-
Perlの配列をJavaScriptに渡せ...
-
[JS] setAttributeで保存される...
-
JSONデータを50音順でソートしたい
-
二次元配列の全要素の全要素を...
-
javascriptを用いて作成された...
-
バナーのランダム表示(複数、...
おすすめ情報