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

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

配列を抜き出し新しい配列を作りたい

いつも参考にさせて頂いています。 今あるボタンAに function sortFunc(a, b) { return a.ID-b.ID; } hoge = new Array(); hoge.push({ID:_root.g1, a:"○○", b:"mc_maru"}); hoge.push({ID:_root.g2, a:"△△", b:"mc_sankaku"}); hoge.push({ID:_root.g3, a:"□□", b:"mc_shikaku"}); hoge.sort(sortFunc); // 結果 { } for (var i = hoge.length; i>=0; i--) { trace(hoge[i].ID+hoge[i].a+hoge[i].b); this.key_text.text +=(("\r")+hoge[i].a); } } このような配列の並び替えをしています。 _root.g1、2、3の点数を受けて点数の高い順に並び替えしてる 物を_key.textと言うダイナミックテキストに渡して表示させています。 この並び替えを利用し点数の高いものを二つを抜きだしたいのですが、 Array.slice()をどうやって使えばいいのか分からず困っています。 わかる方いらしたら教えて頂けないでしょうか?

  • Flash
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • 2つの配列から新しい配列を作成したい

    「Array A B」より「Array C」を作成したいのですが、どうしたらいいでしょうか? ※「Array A」キーと「Array B」idキーの値を結び付けたい Array A (   [3] => 3   [1] => 15   [4] => 3   [2] => 6 ) Array B (   [0] => Array     (       [id] => 1       [area] => 東京     )   [1] => Array     (       [id] => 2       [area] => 大阪     ) )   ↓ Array C (   [0] => Array     (       [1] => 15       [area] => 東京     )   [1] => Array     (       [2] => 6       [area] => 大阪     ) )

    • ベストアンサー
    • PHP
  • 多次元配列の並び変えについて

    <?php $food["a"]["1"]= "hoge1"; $food["b"]["2"]= "hoge2"; $food["c"]["3"]= "hoge3"; $food["d"]["4"]= "hoge4"; ?> 上記の配列について、1,2,3,4のキーの順番でソートしたいのですが、うまく出来ません。 一次元配列だと簡単なのですが、二次元配列だとどうやったらよいのでしょうか? array_multisortを使うと、多次元でも並び変えはできると他のサイトで読みましたが、 これは結局値でソートしてますよね? 私は純粋にキーのみでソートしたいのですが、色々調べているのですがどうも複雑なプログラムを 書かないとできないような気がしてきました。

    • 締切済み
    • PHP
  • 関数内での繰り返し処理の結果を配列で受け取りたい

    関数内でfor文で繰り返し処理を行い、 結果を配列として返すような関数を書きたいと思っています。 function hoge(){ var a = [1,2,3,4]; for (var i=0; i < a.length; i++){ a1 = "a" + i; var arr = new Array(); arr.push(a1); } return arr; } しかし、以下のように 関数hogeの結果を変数bで受け取ってみると、 配列の最後のデータしか表示されません。 var b = hoge(); alert(b); //a3のみが表示される a0, a1, a2, a3と表示されるようにするには、 どうしたらよいでしょうか。

  • JavaScriptで配列に配列を追加できません

    var array = [ ]; var add1 = ["a", "b"]; var add2 = ["c", "d"]; array.push(add1); array.push(add2); ----------------------------------------- 期待しているarrayの中身 [["a", "b"], ["c", "d"]] ----------------------------------------- 実際の実行結果 ["a", "b", "c", "d"] ----------------------------------------- どうすれば良いのでしょうか?

  • 配列に動的に連想配列を入れる方法を教えてください

    質問させてください。 $mods = array('def', 'con', 'vie'); (ここでは$modsの要素は3つですが、環境によって要素の数が変わるとします。) これを連想配列で array( 'def' => './a/b/def/o', 'con' => './a/b/con/o', 'vie' => './a/b/vie/o' ) のような形に動的にしたいと思います。 その為 array( $mods[$i] => './a/b/' . $mod[$i] . '/o', ) のように$modsの要素数だけ動的に入れていきたいのですがどのようにすればいいのでしょうか? array_push()だと値だけが入ると思うので、良く分かりませんでした。 $front->setControllerDirectory(array( 'default' => APP_DIR . DS . 'modules' . DS . 'default' . DS . 'controllers' )); のようなルーターにパスをその時の環境に合わせて$key=>$valueの連想配列をどんどん入れていきたいと考えております。 説明が分かりにくいかもしれませんが宜しくお願いします。

    • ベストアンサー
    • PHP
  • 配列の抽出

    PHPの配列の関数で数行程度でフィルターのような機能は可能なのでしょうか? 以下、サンプルですが血液型がAの新しい配列を作成するには、どのようにしたら良いのでしょうか? また、新しい配列でなく$matrixを血液型がAのみにする方法も知りたいです。 実際の例で示していただけましたら助かります。 <?php // 血液型(blood)がAの人のみの新しい、配列にしたい。 $agent1 = array( "blood"=>"A", "B"=> 80, "W"=> 60, "H"=> 85 ); $agent2 = array( "blood"=>"B", "B"=> 90, "W"=> 62, "H"=> 90 ); $agent3 = array( "blood"=>"O", "B"=> 78, "W"=> 56, "H"=> 80 ); $agent4 = array( "blood"=>"AB", "B"=> 81, "W"=> 59, "H"=> 83 ); $agent5 = array( "blood"=>"A", "B"=> 88, "W"=> 58, "H"=> 84 ); $matrix = array(); array_push($matrix, $agent1); array_push($matrix, $agent2); array_push($matrix, $agent3); array_push($matrix, $agent4); array_push($matrix, $agent5); var_dump($matrix); exit; ?>

    • ベストアンサー
    • PHP
  • 一致する配列要素数を追加した上、重複を削除したい

    ・配列hogeがある時、idキーの数を数え、count要素として追加したい ・さらに、idキーが重複する内容を削除したい ■前提 hoge (   [0] => Array     (       [id] => 7       [area] => 6     )   [1] => Array     (       [id] => 7       [area] => 6     )   [2] => Array     (       [id] => 8       [area] => 9     ) ) ■欲しい結果 result (   [0] => Array     (       [id] => 7       [area] => 6       [count] => 2     )   [1] => Array     (       [id] => 8       [area] => 9       [count] => 1     ) )

    • ベストアンサー
    • PHP
  • PHPの配列について

    PHPの配列についての質問です。 以下のソースを // == ソース == function hoge( $foo ) { $arrs['a'] = 'A'. $foo; $arrs['b'] = 'B'. $foo; $arrs['c'] = 'C'. $foo; $arrs['d'] = 'D'. $foo; } hoge( '3' ); hoge( '9' ); // == /ソース == 実行すると print_rは // == print_r == Array (   [a] => A3   [b] => B3   [c] => C3   [d] => D3 ) Array (   [a] => A9   [b] => B9   [c] => C9   [d] => D9 ) // == /print_r == のようになります。 これを 関数を実行するごとに (0から IDのような 配列を組むようにする) 以下のようにするには どのようにすればよいでしょうか? // == print_r == Array (   [0] => Array     (       [a] => A3       [b] => B3       [c] => C3       [d] => D3     )   [1] => Array     (       [a] => A9       [b] => B9       [c] => C9       [d] => D9     ) ) // == /print_r == 使用目的は get_contentsしたものを正規表現で取り出し 配列にする処理に使おうと思っています。

    • ベストアンサー
    • PHP
  • 文字列になっている配列を‥

    以下の値がDBに文字列の項目に登録されています。 DB から値を取得したのはいいのですが文字列なので foreach でグルグルしようとすると怒られてしまいます。 配列の型に変換できればいいのですが(array)だとうまく行かないしどうすればいいかどなたかご教授願えないでしょうか。 よろしくお願いします。 ■値(文字列でDBに格納されてます‥) array( 1=>'a', 2=>'b', 3=>'c', 10=>array( 'A'=>1, 'B'=>'hoge1', ), 11=>array( 'A'=>2, 'B'=>'hoge2', ), 12=>array( 'A'=>3, 'B'=>'hoge3', ), )

    • 締切済み
    • PHP
  • 特定の要素を抜き取って連想配列へ

    例えば、 $hoge = "%_A_%あ%_A_%%_B_%123%_B_%%_C_%%_C_%%_D_%hogehoge%_D_%"; というようなデータがあった場合、 %_?_% の?部分を連想配列のキーとして、 そのはさまれた部分を前途キーの内容として格納したいのですが、 どのようにすればいいでしょうか? (%_?_%~%_?_% において?の組み合わせは必ず単一でしか存在しません) 求めている結果は $array['A'] => あ $array['B'] => 123 $array['C'] => //空要素 $array['D'] => hogehoge のような形です とりあえず if (preg_match("/%_([A-Z])_%(.*)%_$1_%/" , $hoge ,$matched) ){ // $matchedを解析して$arrayに割り当て } とすればいけるかな、と思いやってみましたがパターンマッチの条件にすら当てはまらず撃沈 preg_matchのマッチ条件内ではまだ$1が使えないようでした 環境はPHP4です よろしくお願いします

    • ベストアンサー
    • PHP

専門家に質問してみよう