• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列を抜き出し新しい配列を作りたい)

配列の並び替えと要素の抜き出し方法について

このQ&Aのポイント
  • 配列を並べ替える方法についての質問です。
  • _root.g1、g2、g3の点数を受けて、点数の高い順に配列を並べ替えています。
  • 配列から要素を抜き出す方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

その比較関数ですと、” ID ”の値の小さいものから順に、つまり ID フィールドに関して昇順に並び替えられます。 例えば、ID フィールドの内容である変数が g1 = 100 ・ g2 = 300 ・ g3 = 200 とすると、ソート後の hoge の中身は  hoge[ 0 ] → ID : 100 a : ○○ b : mc_maru  hoge[ 1 ] → ID : 200 a : □□ b : mc_shikaku  hoge[ 2 ] → ID : 300 a : △△ b : mc_sankaku となります。 最後の要素から表示すると ID に関して降順になりますが、実際の配列変数は昇順に並んでいます。 この状態で ID が最も高いものとその次に高いものとは、要するに配列変数の最後とその1つ前の要素ということになります。 slice の条件が思いつかないのでしたら、要素を取り出してコピーするスクリプトを自作してみてはいかがでしょう。 配列変数は、名前は同じで管理番号だけが異なる変数の集まりです。 この番号を指定する部分を工夫すると、Array クラス( Flash MX 以前ではオブジェクト)の機能として用意されていない処理もいろいろと作ることができます。 例えば、並び替えた後の hoge の最後から2つを新しい配列変数 high にコピーするスクリプトは、次のようになります。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)  //後ろから2つをhighにコピー  high = new Array();  base_index = hoge.length - 1;  for( i = 0 ; i < 2 ; i++ )  {   high[ i ] = hoge[ base_index - i ];  } 配列変数の length プロパティには、配列変数に含まれる要素の総数が入っています。 今回の例ですと hoge には要素が3つあるので、 hoge.length は 3 です。 しかし、配列変数の管理番号(インデックス)は 0 から始まるため、実際の変数は hoge[ 0 ] ~ hoge[ 2 ] と、2番までしかありません。 つまり、配列変数の最後の要素のインデックスは length - 1 です。 この最後の要素から順に2つを取り出すには for ループを利用します。 最初の1つは最後の要素ですから hoge.length - 1 、その次は hoge.length - 1 の1つ前の要素ということで、hoge.length - 1 から更に1引いた番号となります。 今回取り出したいのは2つだけなのでここでやめますが、例えば3つ取り出す時の3つめは hoge.length - 1 - 2 、4つめは hoge.length - 1 - 3 ・・・というように増やしていくと、後ろから順に取り出していくことができます。 従って、hoge.length - 1 から1ずつカウントアップする変数の値を引いていくことで、後ろから順番に取り出していけるというわけです。 取り出したものを別の配列変数にコピーする時は、取り出す際に使った for ループのカウンタをコピー先のインデックスの指定に利用すると便利です。 他にも、push メソッドでコピー先の配列変数に順次追加していく方法もあります。 *********************** もとの配列を切り詰めてもいい場合は、配列変数の最後に要素を追加するメソッド” push ”の対になるメソッド” pop ”を利用することもできます。 hoge.pop(); で、hoge の最後の要素を取り出すことができます。 取り出した要素を、コピー先の配列変数の push メソッドでコピーの最後に追加します。 これを2回繰り返すと、hoge の最後から2つを取り出して新しい配列変数を作ることができます。 ただし、pop はもとの配列変数の要素を切り落としていってしまいますので、もとの配列変数をそのまま取っておきたい場合は不向きです。 コピーするのではなく、後ろから1つずつ切り取って別の配列変数に移すイメージですね。 *********************** もとの配列変数が昇順になっていなくても構わないのなら、最初から降順に並べ替えておくのも1つの方法です。 比較関数を  function sortFunc( a , b )  {   return -( a.ID - b.ID );  } このように作ると、ID に関して降順にソートされるようになります。 すると ID が最も高いものとその次のものとは hoge[ 0 ] と hoge[ 1 ] ですから、この2つを for ループか slice メソッドで取り出せばいいのです。 先頭から2つ取り出すのは、”後ろから2つ”と考えるよりも分かりやすいと思います。 ・・・とまあ、この通りいろいろな方法があります。 Array クラスには便利なメソッドが用意されていますけれど、便利な反面、さしあたって必要ではない処理も含まれていて、全般的に処理は重いです。 for ループなどで用が済むなら、既存のメソッドにこだわる必要もないと思います。

_konkuri
質問者

お礼

お返事遅れて申し訳ございません。 とても親切でわかりやすく説明して頂いてありがとうございます。 まだまだ勉強中の身です。 他の掲示板などでもお世話になり、色々ご教授して頂きました。 これからも参考にさせて頂きます。 お返事遅れた事本当に申し訳ありませんでした。

すると、全ての回答が全文表示されます。

関連するQ&A