WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:JavaScriptで、配列オブジェクトのある要素の小さい順に並び替える

0:[投稿] 剣心 [2006/07/27 19:37 ] [環境:IE6,WinXP わからない]

はじめまして。

今、JavaScriptであるものを作っているのですが、下記のようなオブジェクトを作ったのですが・・・
※数値や文字は適当です。ちなみにbとcは関係ないです;
-----------------------------------
function MakeObject(_a,_b,_c,_mes) {
this.a = a; this.b = b; this.c = c;
this.mes = mes;
}
data = [new MakeObject(3,1,0,"たぶん「ぜろ番目」"),new MakeObject(1,5,0,"きっと「いち番目」"),MakeObject(2,2,1,"なぜか「に番目」"),MakeObject(1,2,0,"それでも「さん番目」")];
-----------------------------------

これを、data[?].aの数が小さい順番に並び変えたいのですが・・・。
ちなみに、data[?].aだけを並びかえるのではなく、それに伴って「data[?].a」と「data[?].b」、
「data[?].c」、それと「data[?].mes」も、全ての位置を変えたいのです。
また、data[?].aの数が一緒なら、今の並びのままにしたいです。
(上のdata配列を、最終的に
data[0]のオブジェクトは左から、1,5,0,"きっと「いち番目」"
data[1]のオブジェクトは左から、1,2,0,"それでも「さん番目」"
data[2]のオブジェクトは左から、2,2,1,"なぜか「に番目」"
data[3]のオブジェクトは左から、3,1,0,"たぶん「ぜろ番目」"
という具合に入れ替えたいのです。
ちなみに、data[0]と[1]は、aの値は一緒ですが、
最初の並びではdata[1]のほうが後だったので、必ずこの順番になるようにしたいです。)


1:[回答] 剣心 [2006/07/27 19:39 ]

すみませんが訂正させていただきます;;
MakeObjectの中の部分は

-----------------------------------
this.a = _a; this.b = _b; this.c = _c;
this.mes = _mes;
-----------------------------------

でした。


2:[回答] m035 [2006/07/28 02:15 ][URL]

data.sort(function(a,b){return a.a-b.a});
で試したところIE6では希望通りの動作、FireFox1.5.0.4では「いち」と「さん」が逆でした。
元の配列のクローンをソート前に作っておき、a.a-b.a==0の時に2者が元の配列で何番目だったかを調べ、比較すれば確実な動作に出来るでしょう。


3:[質問] 剣心 [2006/07/28 11:49 ]

回答ありがとうございます。

data.sort(function(a,b){return a.a-b.a});
の比較関数の部分についてなんですが、
a.a-b.aというのはどういう計算をしているのでしょうか。


4:[回答] 神崎 [2006/07/28 11:53 ]

第二項目でのソートでいいでしょうか?

第一項目、MakeObject.aを昇順で、
第二項目、MakeObject.bを降順で並べ替えます。

data.sort(function(a,b){return (a.a-b.a)||(b.b-a.b);});


<script type="text/JavaScript">
function MakeObject(_a,_b,_c,_mes) {
this.a = _a; this.b = _b; this.c = _c;
this.mes = _mes;
return this;
}
data = [new MakeObject(3,1,0,"たぶん「ぜろ番目」"),
new MakeObject(1,5,0,"きっと「いち番目」"),
new MakeObject(2,2,1,"なぜか「に番目」"),
new MakeObject(1,2,0,"それでも「さん番目」")];

for(var i=0;i<data.length;i++){
document.write(''+data[i].a+","+data[i].b+","+data[i].c+","+data[i].mes+"<br>");//検証
}
document.write("<hr>");
//data.sort(function(a,b){return a.a-b.a;});
data.sort(function(a,b){return a.a-b.a||b.b-a.b;});
for(var i=0;i<data.length;i++){
document.write(''+data[i].a+","+data[i].b+","+data[i].c+","+data[i].mes+"<br>");//検証
}
</script>

第二項目での並べ替えをせずに、
第一項目が同じ場合は元の順番を維持する、という場合はどうしたものか、、、
やっぱりクローンを作って比較でしょうか。。。


5:[質問] 剣心 [2006/07/28 12:21 ]

>神崎さん
回答ありがとうございます。
第二項目(.b)第三項目(.c)は関係ないんです;
消さないでおいてしまってすみません。

それと、それをヒントに考えました。
count = 0;
function MakeObject(_a,_b,_c,_d,_mes) {
this.a = _a; this.b = _b; this.c = _c; this.d = _d; this.mes = _mes;
count++;
return this;
}
data = [new MakeObject(3,1,0,count,"たぶん「ぜろ番目」"),
new MakeObject(1,5,0,count,"きっと「いち番目」"),
new MakeObject(2,2,1,count,"なぜか「に番目」"),
new MakeObject(2,2,0,count,"それでも「さん番目」"),

これで、第四項目には0〜3が入るはず・・・
sortメソッドの比較関数についてよくわからないんですが、
第一項目と第四項目を昇順で並べるにはどうすればいいでしょうか。
(第一項目が優先)
こうすればクローンを作らなくてもできるようになりませんか・・・?


6:[回答] m035 [2006/07/28 20:46 ][URL]

var count=0;
function MakeObject(_a,_b,_c,_mes) {
this.a = _a; this.b = _b; this.c = _c; this.d = count++; this.mes = _mes;
return this;
}
var data = [new MakeObject(3,1,0,"たぶん「ぜろ番目」"),
new MakeObject(1,5,0,"きっと「いち番目」"),
new MakeObject(2,2,1,"なぜか「に番目」"),
new MakeObject(2,2,0,"それでも「さん番目」")];
という書き方の方がスマートです。
第四項を第二比較対象にするなら>>4の第二項比較部分を変更すればよろしいかと思います。
data.sort(function(a,b){return a.a-b.a||b.b-a.b;});

data.sort(function(a,b){return a.a-b.a||b.d-a.d;});
にすれば出来そうです。
それと、クローンを作る場合のサンプルです。
<script type="text/javascript">
<!--
function MakeObject(_a,_b,_c,_mes) {
this.a = _a; this.b = _b; this.c = _c;
this.mes = _mes;
}
data = [new MakeObject(3,1,0,"たぶん「ぜろ番目」"),new MakeObject(1,5,0,"きっと「いち番目」"),new MakeObject(2,2,1,"なぜか「に番目」"),new MakeObject (1,2,0,"それでも「さん番目」")];
var clone=data;
function chk(ar){
for(var i=0,len=clone.length;i<len;i++)if(clone[i]==ar)break;
return i;
}
data.sort(function(a,b){
return a.a-b.a||chk(a)-chk(b);
});
//以下内容確認
var bf="";
for(var i in data)bf+=data[i].mes+"<br>";
document.write(bf);
//-->
</script>


7:[完了] 剣心 [2006/07/29 11:46 ]

丁重な回答をいただき、ありがとうございました。
今後も、よろしくお願いします。

回答(必須): 状態:

お名前(必須):

URL:




[戻る]