javascriptで2つのArrayを同時にソートする方法

このQ&Aのポイント
  • javascriptで2つのArrayを同時にソートする方法について教えてください。Array1の変化をArray2にも同時に適用する方法が知りたいです。
  • Array1とArray2には数値と文字列の情報が格納されています。数値を小さい順にソートする際に、それに合わせて文字列の情報も変化させたいです。
  • また、Arrayには多重Arrayも含まれています。それらを利用して同時にソートを行いたいです。具体的なプログラム例があれば嬉しいです。
回答を見る
  • ベストアンサー

javascriptで2つのArrayの同時ソート

javascriptをしています。そしてArrayを2つ用意してArray1の変化をArray2にも同時に適用しながらソートしたいと考えているのですが、どんな方法で実行すればよいのか分かりません。 例としまして 4 あ     2 お 2 お     4 あ 6 う  →  5 い 5 い     6 う 7 え     7 え という具合に、Array1には4,2,6,5,7がありArray2にはあおういえという情報がはいっています。 そしてArray1の数値を小さい順に並べ替えるのと同時にそれに合うようにArray2の情報も変えるということがしたいのです。 Arrayには多重ArrayというArray[0][1]というのもありますが、これも使えるのでしょうか? アドバイスでもありがたいですが、プログラムの具体例を上げてくれると更にありがたいです。 よろしくお願いします。

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

  • ベストアンサー
回答No.1

var A = [ 4, 2, 6, 5, 7 ]; var B = [ 'お','あ','い','う','え' ]; function merge (a, b) {  var result = [];  var len = a.length;    for (var i = 0; i < len; i++)   result[i] = [a[i], b[i]];  return result; } function sortCbFunc (a, b) {  return (a[0] > b[0]) - (a[0] < b[0]); } alert (merge (A, B).sort (sortCbFunc)); alert ([ [4,'お'], [2,'あ'], [6,'い'], [5,'う'], [7,'え'] ].sort (sortCbFunc));

IWNM_SP
質問者

お礼

なんとかソートすることが出来ました。本当にありがとうございました。

その他の回答 (2)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

すでに回答がでていますが、タイプが少し違うもの… 普通の関数にしてあるので使い方は、  sortArray( 配列,[配列],[配列]・・・ ) となります。(配列数は可変) (全角空白は半角に) function sortArray(){  var a = arguments, n = a.length;  if(n == 0) return;  var ary = [], i, j, f = false, len = a[0].length;  for(i=0; i<n; i++)   f = f || Object.prototype.toString.call(a[i])!="[object Array]" || len != a[i].length;  if(f)   throw new Error("lengths of arrays are not same");  for(j=0; j<len; j++){   ary[j] = [];   for(i=0; i<n; i++)    ary[j].push(a[i][j]);  }  ary.sort();  for(j=0; j<len; j++)   for(i=0; i<n; i++)    a[i][j] = ary[j][i]; } var A = [ 4, 4, 4, 3, 3 ,3]; var B = [ 'お','あ','い','う','え','う']; var C = [ 4, 1, 3, 5, 7, 4]; sortArray(A, B, C); alert(A + "\n" + B + "\n" + C);

IWNM_SP
質問者

お礼

なんとかソートすることが出来ました。本当にありがとうございました。

  • think49
  • ベストアンサー率59% (285/482)
回答No.2

// 全角空白は半角空白に置換してください。 function Hoge (array1, array2) {  this.array1 = array1;  this.array2 = array2;  return this; } Hoge.prototype.sort = function () {  var array1, array2, array3, array, i, l;  array1 = this.array1;  array2 = this.array2;  array3 = [];  if (array1.length !== array2.length) {   throw new RangeError('array1.length isn\u0027t equivalent to array2.length');  }  for (i = 0, l = array1.length; i < l; ++i) {   array3.push([array1[i], array2[i]]);  }  array3.sort();  for (i = 0, l = array3.length; i < l; ++i) {   array = array3[i];   array1[i] = array[0];   array2[i] = array[1];  } }; var array1 = [4,2,5,6,7]; var array2 = ['お','あ','い','う','え']; var hoge = new Hoge (array1, array2); hoge.sort(); alert(hoge.array1); // [2, 4, 5, 6, 7] alert(hoge.array2); // ["あ", "お", "い", "う", "え"] // (備考) 初めから array3 (二次元配列) になっていればここまで面倒なことをしなくて済みます。

IWNM_SP
質問者

お礼

なんとかソートすることが出来ました。本当にありがとうございました。

関連するQ&A

  • javascript バブルソート

    javascriptでバブルソートの実装をしています。 リストにある数値を取得して昇順 or 降順したいのですがうまくいきません。 方法を教えていただけないでしょうか。 よろしくお願いします。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <script type="text/javascript"> function bubbleSort(){ var liVal = document.getElementsByTagName("li"); var array = []; for(var i = 0; i < liVal.length; i++){ for(var j = 0; j < liVal.length-i-1; j++){ array[j] = parseInt(liVal[j].innerHTML); if(array[j] > array[j+1]){ var n = array[j]; array[j] = array[j+1]; array[j+1] = n; } } } } </script> </head> <body> <ul> <li>10</li> <li>5</li> <li>48</li> <li>22</li> <li>679</li> </ul> <p><a href="javascript:void(0);" onclick="bubbleSort()">ソート(降順)</a></p> </body> </html>

  • Arrayオブジェクトのsort()メソッド

    テキストに書いているArrayオブジェクのsort()メソッドを実行しました。 ソースコードは以下のとおりです。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> <title>Arrayオブジェクトのメソッド</title> <script type="text/javascript"> </script> </head> <body bgcolor="#FFFFFF"> <p style="font-size:200%"> <script type="text/javascript"> var ages = new Array(4, 6, 10, 24, 1, 11, 40); ages = ages.sort(); document.write(ages.join(" > ")); </script> </p> </body> </html> すると、ブラウザにこのように表示されました。 (ちなみに > は矢印記号で大小を比べるものではありません。) 1 > 10 > 11 > 24 > 4 > 40 > 6 これを見る限り数字の順番が変わっています。 テキストでは、これを「文字列として昇順に並び替えた」と書かれているのですが、私の知識の足りなさから意味がよく分かりません。 ただ、昇順の意味は分かっているつもりです。 もし、昇順に並び替えるのなら、 1 > 4 > 6 > 10 > 11 > 24 > 40 のようになるのではないでしょうか。 頭の悪い私のために是非ともアドバイスを頂ければ大変助かるのですが。 どうぞ宜しくお願い致します。

  • Array.sortメソッドのデフォルト比較関数

    JavaScriptのArray.sortメソッドは、 引数を指定しなければデフォルトの比較関数でソートされますが、 この比較関数を取り出して利用できないでしょうか。 要件は、プロパティ[name]と[value]を持ったオブジェクトの配列のソートです。 nameプロパティは半角英数字の文字列で、これをキーにソートしたいと考えています。 ソートの基準は、Array.sortのデフォルトと同じです。 つまり、こんなコードを想定しています。 var ary = [o1, o2, o3]; // o1~o3はそれぞれ上記のオブジェクト ary.sort(function(a, b){ return compare(a.name, b.name); }); このコードにおけるcompare関数を、Array.sortのデフォルト比較関数にしたいのですが、 これは自前で作成するしかないのでしょうか。 数値だけでなく文字列全般の比較になるので、結構実装が面倒そうなのですが、 自作する場合に何か使えそうな標準関数等、無いでしょうか。 今のところ思いついているのは、下記みたいなものです。 var compare = function(a, b) {  var temp = [a, b];  temp = temp.sort();  return temp[0] === a ? -1 : 1; } 比較関数内で更にArray.sortを呼んで2項目をソートし、 順番が入れ替わったかどうかを判定するだけです。 何だか冗長で気持ち悪いコードですので、代案を探しています。

  • dynatableでの数値のソート順

    教えて下さい。 dynatableでの数値のソート順がおかしくなります。 例) 5 32 3 29 27 2 16 1 0 のようになります。 一桁目だけで見ているのでしょうか? また、どこに何を書けば直りますか?

    • ベストアンサー
    • Java
  • J2SDK1.42 ArrayList ソート?

    ソートの仕方を教えてください。 下記のようなデータを年の順でソートしたいのですが。 格データを配列などで扱っているとしたらどのようなプログラムを組めばよいのでしょうか教えてください。 渡辺 50歳 埼玉県 鈴木 21歳 神奈川県 佐藤 40歳 沖縄県 array1 = new ArrayList();'array.get(0)が名前、array.get(1)が歳 array2 = new ArrayList(); array3 = new ArrayList(); などでは、歳をキーにしてSort()する方法はないのでしょうか? ほかによい方法があれば教えてください。 元データはCSVで配列などにいれてソートや絞込みが行えるようにしたいのですが。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 三菱電機 Q02H SORT命令

    教えて下さい。三菱電機PLC(Q02H)を使い回路を作っているのですが、今回、SORT命令を使うことになりました。非常に便利なのですがイマイチ上手くいきません。シュミレータにてプログラミングマニュアルに書いてあるプログラム例を実行すると、格納されている数を上手く並べ替えてくれるのですが、現在、使用しているPLC(Q02H)を使う為、プログラム例にあるデバイスは使用できません。空きデバイスを確認し使用していないデバイスで試すのですがダメです。状態としては回路にてSM703をONしたのち、SORT回路を実行すると格納されている数を値の大きい順に並べ替えてデバイスの一番上まで送ってくれるのですが、SM703をOFFした状態でSORT回路を実行すると値が小さい順に並べ替えてくれるのですが、一番上まで値を移動してくれず、一番小さい値の格納デバイスからスタートしてしまいます。どこがいけないのでしょうか。 プログラミングマニュアルに書いてあるプログラム例 0  LD X0 1  OUT SM703 2  LD x10 3  SORT D0 K4 K1 M0 D10 4  END 私が実行したプログラム 0  LD X0 1  OUT SM703 2  LD X10 3  SORT D151 K11 K1 M1010 D430 4  END

  • 多段ソート

    C言語というよりはアルゴリズムの話です。 [名前], [生年月日] の2つのカラムで表される固定長の行データが羅列されたファイルがあります。 また、各カラムを比較して行をソートした場合にどの行が何番目にくるかといったインデックス情報を木構造で保持したファイルがあります。 (このファイルは行データの追加・削除時に更新される) これらのファイルを利用して、生年月日でソートし、かつ日時が同じ場合は名前順にソートした場合の上から10個分だけのデータを取り出したいのですが、効率のよい方法は無いでしょうか? 全データを読み込んでから、バブルソート等の順序を崩さないソートを多重にかけることはなるべく避けたいのです。 そのためにソート済みのインデックス的な役割を持つファイルを用意しているのですが、多段ソート時にどう応用すればよいのかわからなくなってしまいました。 例 日時、名前の順にソートされた上4つ分のデータが欲しい。 【一覧】 [1行目] 10/20, Aさん [2行目] 11/30, Fさん [3行目] 9/10, Cさん [4行目] 11/30, Bさん [5行目] 12/10, Dさん 【生年月日でソートされた インデックス】 9/10, 3行目 10/20, 1行目 11/30, 2行目 11/30, 4行目 12/10, 5行目 【名前でソートされた インデックス】 Aさん, 1行目 Bさん, 4行目 Cさん, 3行目 Dさん, 5行目 Fさん, 2行目 得たい結果 [3行目] 9/10, Cさん [1行目] 10/20, Aさん [4行目] 11/30, Bさん [2行目] 11/30, Fさん

  • 連想配列のソートについて

    調べても分からなかったので質問させてください。 現在アクセスログ集計ツールを作成中です。 決められたurlのページにアクセスがあった時にDB登録し、カウントする単純な仕組みで、ツールの方では日にちを任意で選択してもらいエクセル出力する仕組みです。 質問させていただきたいのが、カウントをするページが例えば4ページあり、そのページ名の接頭を取って「date」「index」「login」「stock」「option」というキーの連想配列を作っています。 array(5) { ["date"]=> array(3) { [0]=> string(10) "2015/02/01" [1]=> string(10) "2015/02/02" [2]=> string(5) "total" } ["Index"]=> array(3) { [0]=> int(2) [1]=> int(4) [2]=> int(6) } ["Login"]=> array(3) { [0]=> int(6) [1]=> int(6) [2]=> int(12) } ["Stock"]=> array(3) { [0]=> int(3) [1]=> int(4) [2]=> int(7) } ["option"]=> array(3) { [0]=> int(2) [1]=> int(1) [2]=> int(3) } } このキーである「index」「login」「stock」「option」の順番が取得するデータによって入れ替わってしまいます。 理想的な順番としては「login」「index」「option」「stock」の順番にソートしたいのですが、調べても分かりませんでした。sort関数はアルファベット順とか、数値順とか決まったルールのソートができるようですが、こちらで意図的に順番を操作する事はできるのでしょうか? もしあれば教えていただきたいです、何卒よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • こんなJavaScriptありますか?

    HTML文書にテキストで -------------------------------------- 3.文字C 4.文字D 2.文字B 6.文字F 1.文字A 5.文字E -------------------------------------- とあったとします。これを↓の状態にしたいです。 -------------------------------------- 文字A 文字B 文字C 文字D 文字E 文字F -------------------------------------- (1.~6.の順にソートし、1.~6.を消す) ソートするJavaScript、1.~6.を消すJavaScript、 どちらかでも構いません。 また、参考になりそうな情報だったら、 なんでも結構です。どなたかアドバイス頂けませんか? ちなみに私自身のJavaScriptのレベルは、ほぼゼロです。 でも自分でいろいろ調べようと思っていますので そのヒントを頂ければ嬉しいです。 どうぞよろしくお願いします。

  • ホームページ内で行う表のソート

    Yahooの不動産のページ(同じようなサイトは沢山あると思いますが)のようなものを作成したいのです。 列が6行くらいあり、そのうち3つ(例:平米数、金額、築年数)位でソートできるような、可能であればその3つに優先順位をつけてソートしたいのです。 これは、なんのプログラムを使って作成しているのでしょうか? 簡単なものですとJavaScriptでできるようですが、YahooなどはCGIなのでしょうか? すみませんが、よろしくお願いいたします。

専門家に質問してみよう