JavaScript 配列 新しいページはコチラ
提供: yonewiki
(→配列ソート+ソート方法指定 sort) |
|||
1行: | 1行: | ||
[[JAVA Script#リファレンス]]に戻る。 | [[JAVA Script#リファレンス]]に戻る。 | ||
+ | |||
+ | '''1ページで配列が丸わかり。''' | ||
47行: | 49行: | ||
サンプルプログラムは以下のとおりです。 | サンプルプログラムは以下のとおりです。 | ||
− | < | + | <syntaxhighlight2 lang="javascript" line start="1"> |
<HTML> | <HTML> | ||
<HEAD> | <HEAD> | ||
93行: | 95行: | ||
</BODY> | </BODY> | ||
</HTML> | </HTML> | ||
− | </ | + | </syntaxhighlight2> |
[[Media:JavaScript Array declare.html|サンプル実行結果]] | [[Media:JavaScript Array declare.html|サンプル実行結果]] | ||
− | + | 上記サンプルのData2Arrは要素数2でpopメソッドで要素を追加できますが、要素番号2以降に格納され、要素番号0と1の最初に準備された要素はカラのまま要素番号2にデータとしての数値1が要素番号3にデータとしての数値4が格納されます。また、要素数0で定義した配列Data1ArrとData4Arrもpopメソッドによって要素数が拡張されつつ、データが格納できるようになっていて、宣言のときに要素数を決定したり、配列の大きさを調整するような処理があまり重要ではないことが伺い知れます。このことから、要素番号を管理することはあえて実施せずに適当にくっつけたり、切り離したりしても、要素数が自動で管理されている状態になっていることが多いため、配列要素数の状態については、あまり意識しなくてもよいでしょう。複雑な操作をしたいときに状態がどうなっているか確認することは必要になるかもしれません。 | |
== '''要素数の取得・設定 length''' == | == '''要素数の取得・設定 length''' == | ||
116行: | 118行: | ||
サンプルは以下のとおりです。 | サンプルは以下のとおりです。 | ||
− | < | + | <syntaxhighlight2 lang="javascript" line start="1"> |
<HTML> | <HTML> | ||
<HEAD> | <HEAD> | ||
138行: | 140行: | ||
</BODY> | </BODY> | ||
</HTML> | </HTML> | ||
− | </ | + | </syntaxhighlight2> |
[[Media:JavaScript Array length.html|サンプル実行結果]] | [[Media:JavaScript Array length.html|サンプル実行結果]] | ||
151行: | 153行: | ||
− | < | + | <syntaxhighlight2 lang="javascript" line start="1"> |
<HTML> | <HTML> | ||
<HEAD> | <HEAD> | ||
236行: | 238行: | ||
</BODY> | </BODY> | ||
</HTML> | </HTML> | ||
− | </ | + | </syntaxhighlight2> |
[[Media:JavaScript Array concat.html|サンプル実行結果]] | [[Media:JavaScript Array concat.html|サンプル実行結果]] | ||
250行: | 252行: | ||
という感じで指定します。サンプルは以下の通りです。 | という感じで指定します。サンプルは以下の通りです。 | ||
− | < | + | <syntaxhighlight2 lang="javascript" line start="1"> |
<HTML> | <HTML> | ||
<HEAD> | <HEAD> | ||
301行: | 303行: | ||
</BODY> | </BODY> | ||
</HTML> | </HTML> | ||
− | </ | + | </syntaxhighlight2> |
[[Media:JavaScript Array slice.html|サンプル実行結果]] | [[Media:JavaScript Array slice.html|サンプル実行結果]] | ||
329行: | 331行: | ||
具体的な利用サンプルは以下のとおりです。 | 具体的な利用サンプルは以下のとおりです。 | ||
− | < | + | <syntaxhighlight2 lang="javascript" line start="1"> |
<HTML> | <HTML> | ||
<HEAD> | <HEAD> | ||
380行: | 382行: | ||
</BODY> | </BODY> | ||
</HTML> | </HTML> | ||
− | </ | + | </syntaxhighlight2> |
[[Media:JavaScript Array splice.html|サンプル実行結果]] | [[Media:JavaScript Array splice.html|サンプル実行結果]] | ||
401行: | 403行: | ||
− | < | + | <syntaxhighlight2 lang="javascript" line start="1"> |
<HTML> | <HTML> | ||
<HEAD> | <HEAD> | ||
452行: | 454行: | ||
</BODY> | </BODY> | ||
</HTML> | </HTML> | ||
− | </ | + | </syntaxhighlight2> |
[[Media:JavaScript Array unshift.html|サンプル実行結果]] | [[Media:JavaScript Array unshift.html|サンプル実行結果]] | ||
466行: | 468行: | ||
− | < | + | <syntaxhighlight2 lang="javascript" line start="1"> |
<HTML> | <HTML> | ||
<HEAD> | <HEAD> | ||
517行: | 519行: | ||
</BODY> | </BODY> | ||
</HTML> | </HTML> | ||
− | </ | + | </syntaxhighlight2> |
[[Media:JavaScript Array shift.html|サンプル実行結果]] | [[Media:JavaScript Array shift.html|サンプル実行結果]] | ||
537行: | 539行: | ||
− | < | + | <syntaxhighlight2 lang="javascript" line start="1"> |
<HTML> | <HTML> | ||
<HEAD> | <HEAD> | ||
588行: | 590行: | ||
</BODY> | </BODY> | ||
</HTML> | </HTML> | ||
− | </ | + | </syntaxhighlight2> |
[[Media:JavaScript Array push.html|サンプル実行結果]] | [[Media:JavaScript Array push.html|サンプル実行結果]] | ||
608行: | 610行: | ||
− | < | + | <syntaxhighlight2 lang="javascript" line start="1"> |
<HTML> | <HTML> | ||
<HEAD> | <HEAD> | ||
681行: | 683行: | ||
</BODY> | </BODY> | ||
</HTML> | </HTML> | ||
− | </ | + | </syntaxhighlight2> |
[[Media:JavaScript Array pop.html|サンプル実行結果]] | [[Media:JavaScript Array pop.html|サンプル実行結果]] | ||
698行: | 700行: | ||
− | < | + | <syntaxhighlight2 lang="javascript" line start="1"> |
<HTML> | <HTML> | ||
<HEAD> | <HEAD> | ||
750行: | 752行: | ||
</BODY> | </BODY> | ||
</HTML> | </HTML> | ||
− | </ | + | </syntaxhighlight2> |
[[Media:JavaScript Array toString.html|サンプル実行結果]] | [[Media:JavaScript Array toString.html|サンプル実行結果]] | ||
764行: | 766行: | ||
− | < | + | <syntaxhighlight2 lang="javascript" line start="1"> |
<HTML> | <HTML> | ||
<HEAD> | <HEAD> | ||
816行: | 818行: | ||
</BODY> | </BODY> | ||
</HTML> | </HTML> | ||
− | </ | + | </syntaxhighlight2> |
[[Media:JavaScript Array join.html|サンプル実行結果]] | [[Media:JavaScript Array join.html|サンプル実行結果]] | ||
836行: | 838行: | ||
− | < | + | <syntaxhighlight2 lang="javascript" line start="1"> |
<HTML> | <HTML> | ||
<HEAD> | <HEAD> | ||
888行: | 890行: | ||
</BODY> | </BODY> | ||
</HTML> | </HTML> | ||
− | </ | + | </syntaxhighlight2> |
[[Media:JavaScript Array reverse.html|サンプル実行結果]] | [[Media:JavaScript Array reverse.html|サンプル実行結果]] | ||
934行: | 936行: | ||
! 配列要素番号!! 商品名 !! 価格 円 | ! 配列要素番号!! 商品名 !! 価格 円 | ||
|- | |- | ||
− | | | + | | 0 || ボールペン || 100 |
|- | |- | ||
− | | | + | | 1 || 3色ボールペン(黒、赤、青) || 250 |
|- | |- | ||
− | | | + | | 2 || 1+2色ボールペン(シャーペン、黒、赤) || 400 |
|} | |} | ||
+ | 実は、連想配列は以下のようにして、初期化できます。 | ||
+ | *連想配列の初期化例 | ||
+ | :var Data1Arr = [ | ||
+ | :{goods_name:'ボールペン', price:100}, | ||
+ | :{goods_name:'3色ボールペン(黒、赤、青)', price:250}, | ||
+ | :{goods_name:'1+2色ボールペン', price:400} | ||
+ | :]; | ||
+ | |||
+ | |||
+ | 上記の連想配列の場合は、 | ||
+ | |||
+ | |||
+ | *Data1Arr[0].goods_name | ||
+ | *Data1Arr[0].price | ||
+ | |||
+ | |||
+ | という、Data1Arr[0]に文字出力はできない二つのプロパティをもったオブジェクトがぶら下がっていて、Data1Arr[0].goods_nameとData1Arr[0].priceの二つのプロパティの中身には文字列や数値が格納されています。要素0番には、"ボールペン" そして、100という数値がそれぞれ格納されています。これが連想配列です。他にも、配列ではない変数にすべてのキー値が異なるユニークなキー値をもった連想配列も作れます。ここでは上記のような配列の中に連想配列を保有している例を多用したいと思います。 | ||
+ | |||
+ | |||
+ | |||
+ | で、なんでしたっけ?そうそう、sortです。おやじギャグ?ダジャレ?違います。sortです。配列に連想配列ではないデータがはいっていたとして単純には以下のように利用します。 | ||
+ | |||
+ | |||
+ | *Data1Arr.sort(); | ||
+ | |||
+ | |||
+ | これで、文字列データ順、あるいは数値データ順の昇順でソートがされます。これに引数をつけて、つまり引数に関数を指定して、ソートする方法について解説したいのでした。 | ||
+ | |||
+ | |||
+ | 例えば、以下のようにするとソート方法を制御する関数を指定することができます。 | ||
+ | |||
+ | :://降順ソート | ||
+ | *Data1Arr.sort(function(BeforeElement,AfterElement){ | ||
+ | :::if(BeforeElement < AfterElement) return 1; | ||
+ | :::if(BeforeElement > AfterElement) return -1; | ||
+ | :::return 0 | ||
+ | ::} | ||
+ | :); | ||
+ | |||
+ | |||
+ | と、関数の中身をがっつりと引数の中に書き込みする方法が一つです。もう一つは、以前の項目で説明したように[[JavaScript 関数|関数]]に名前をつけて | ||
+ | |||
+ | |||
+ | *Data1Arr.sort(SortFunc); | ||
+ | ::… | ||
+ | :://降順ソート | ||
+ | ::function SortFunc(BeforeElement,AfterElement) = { | ||
+ | :::if(BeforeElement < AfterElement) return 1; | ||
+ | :::if(BeforeElement > AfterElement) return -1; | ||
+ | :::return 0 | ||
+ | ::} | ||
+ | ::… | ||
+ | |||
+ | |||
+ | のように、関数を別で定義してもよいです。関数には二つの引数をうけとり前の要素番号と後ろの要素番号を比較した場合に-1もしくは1もしくは0を返却するような関数を作ります。-1が返却される場合は小さい要素番号と大きい要素番号は入れ替わるように動作します。上記の例では、小さい要素番号と大きい要素番号を比較した結果、前の要素の方が小さい値なら、要素番号の大きい方に小さい値がくるように入れ替えなさいという命令になっていて、逆なら前の要素の方が大きい値なら小さい要素番号にくるように入れ替えしなさい。それ以外(同じ値)なら何もしない。という降順ソートを指定しています。昇順の場合は、ソート関数の引数を省略してよいので、何も書かなくてよいでしょう。 | ||
+ | |||
+ | |||
+ | そして、連想配列の場合は、どのプロパティ値を比較して、ソートするのかを関数を使って指定することができて、以下のように指定します。 | ||
+ | |||
+ | |||
+ | :://連想配列priceプロパティ基準の降順ソート | ||
+ | *Data1Arr.sort(function(BeforeElement,AfterElement){ | ||
+ | :::if(BeforeElement.price < AfterElement.price) return 1; | ||
+ | :::if(BeforeElement.price > AfterElement.price) return -1; | ||
+ | :::return 0 | ||
+ | ::} | ||
+ | :); | ||
+ | |||
+ | |||
+ | と、このように特定のプロパティ値を比較した結果に絞ることができます。ソート関数の引数は、他の配列に対してはあまり有効にはならないことがあるので、使いまわしにくいですが、特定のプロパティ値に集中してソートするようなソート関数の引数の関数は名前を付けて繰り返し再利用するような形式の記述を使うことも一つの手段になります。 | ||
+ | |||
+ | |||
+ | 昇順ソートや降順ソートを、ソート関数の引数の中で指定した方が処理速度的にも早くなるし、スマートだとされていますが、いろいろな理由で昇順ソートしてから、それをreverseした方が早いという結果になる場合も発生してくるかもしれません。大きなシステムを作るわけでもない限り、あまり気にしなくてもよいと思いますが、都度、どのようにするのが速度向上につながるのか?そういうことは調べた方が良いかもしれません。 | ||
+ | |||
+ | |||
+ | サンプルプログラムは以下のとおりです。 | ||
+ | |||
+ | |||
+ | <syntaxhighlight2 lang="javascript" line start="1"> | ||
+ | <HTML> | ||
+ | <HEAD> | ||
+ | <TITLE>JavaScript Array sort</TITLE> | ||
+ | </HEAD> | ||
+ | <BODY> | ||
+ | JavaScript Array sort<br /> | ||
+ | <SCRIPT Language="JavaScript"> | ||
+ | <!-- | ||
+ | |||
+ | |||
+ | var Data1Arr = [{goods_name:'ボールペン', price:100},{goods_name:'3色ボールペン(黒、赤、青)', price:250},{goods_name:'1+2色ボールペン', price:400}]; | ||
+ | |||
+ | strData = new String(); | ||
+ | |||
+ | document.write("Data1Arr(初期値)= ","<br />", | ||
+ | " Data1Arr[0].goods_name->",Data1Arr[0].goods_name, ",Data1Arr[0].price->",Data1Arr[0].price,"<br />", | ||
+ | "Data1Arr[1].goods_name->",Data1Arr[1].goods_name, ",Data1Arr[1].price->",Data1Arr[1].price,"<br />", | ||
+ | "Data1Arr[2].goods_name->",Data1Arr[2].goods_name, ",Data1Arr[2].price->",Data1Arr[2].price,"<br />", | ||
+ | "<br />", | ||
+ | "Data1Arr.length = ", Data1Arr.length, "<br /><br />"); | ||
+ | |||
+ | |||
+ | //昇順 連想配列 キー goods_name | ||
+ | Data1Arr.sort(function(BeforeElement,AfterElement){ | ||
+ | if(BeforeElement.goods_name < AfterElement.goods_name) return -1; | ||
+ | if(BeforeElement.goods_name > AfterElement.goods_name) return 1; | ||
+ | return 0; | ||
+ | }); | ||
+ | |||
+ | |||
+ | document.write("Data1Arr(昇順 連想配列 キー goods_name)= ","<br />", | ||
+ | " Data1Arr[0].goods_name->",Data1Arr[0].goods_name, ",Data1Arr[0].price->",Data1Arr[0].price,"<br />", | ||
+ | "Data1Arr[1].goods_name->",Data1Arr[1].goods_name, ",Data1Arr[1].price->",Data1Arr[1].price,"<br />", | ||
+ | "Data1Arr[2].goods_name->",Data1Arr[2].goods_name, ",Data1Arr[2].price->",Data1Arr[2].price,"<br />", | ||
+ | "<br />", | ||
+ | "Data1Arr.length = ", Data1Arr.length, "<br /><br />"); | ||
+ | |||
+ | //降順 連想配列 キー price | ||
+ | Data1Arr.sort(function(BeforeElement,AfterElement){ | ||
+ | if(BeforeElement.price < AfterElement.price) return 1; | ||
+ | if(BeforeElement.price > AfterElement.price) return -1; | ||
+ | return 0; | ||
+ | }); | ||
+ | |||
+ | document.write("Data1Arr(降順 連想配列 キー price)= ","<br />", | ||
+ | " Data1Arr[0].goods_name->",Data1Arr[0].goods_name, ",Data1Arr[0].price->",Data1Arr[0].price,"<br />", | ||
+ | "Data1Arr[1].goods_name->",Data1Arr[1].goods_name, ",Data1Arr[1].price->",Data1Arr[1].price,"<br />", | ||
+ | "Data1Arr[2].goods_name->",Data1Arr[2].goods_name, ",Data1Arr[2].price->",Data1Arr[2].price,"<br />", | ||
+ | "<br />", | ||
+ | "Data1Arr.length = ", Data1Arr.length, "<br /><br />"); | ||
+ | |||
+ | --> | ||
+ | </SCRIPT> | ||
+ | </BODY> | ||
+ | </HTML> | ||
+ | </syntaxhighlight2> | ||
+ | |||
+ | [[Media:JavaScript Array sort.html|サンプル実行結果]] | ||
+ | こんな所ですね。ここまで理解した人は、多分国語力も高い、この分かりにくい説明で理解できたのだから次から次へと理解していけるでしょう。冒頭で丸わかりと書いたのは誇張表現だったかも知れない。管理人が実は反省していることも、此処まで来たあなただから、分かってもらえる。 | ||
[[JAVA Script#リファレンス]]に戻る。 | [[JAVA Script#リファレンス]]に戻る。 |