5

私はこれに似た配列のセットアップを持っています:

var ary1 = new Array("d", "a", "b", "c");
var ary2 = new Array("ee", "rr", "yy", "mm");

var mdAry = new Array(ary1, ary2);

ary1 インデックスと ary2 インデックスは、物事の壮大なスキームで互いに関連する情報です。

d ee
a rr
b yy
c mm

ary1 を sort() して取得できます。

a
b
c
d

しかし、ary2 を個別にソートすると、次のようになります。

ee
mm
rr
yy

これにより、リストに表示されたときに ary1 と ary2 の接続が視覚的に切断されます。ary1 のソートされたソリューションを取得して、それを ary2 に適用できますか? 私はこれを取得したい:

a rr
b yy
c mm
d ee

そうでない場合、残りのインデックスに mdAry[0] ソートされたソリューションを適用するように mdAry をソートできますか?

4

5 に答える 5

3

配列項目が関連している場合は、それらをまとめて保存します。

var arr = [
  {x: 'd', y: 'ee'}, 
  {x: 'a', y: 'rr'}, 
  {x: 'b', y: 'yy'},
  {x: 'c', y: 'mm'}
];

arr.sort(function(a, b) {
  if (a.x != b.x) {
      return a.x < b.x ? -1 : 1;
  }
  return 0;
});
于 2013-05-23T04:26:45.240 に答える
1

これを行う 1 つの方法は、データ構造をより簡単に並べ替えることができるものに変換し、後で元に戻すことです。

var ary1  = ["d", "a", "b", "c"],
    ary2  = ["ee", "rr", "mm", "yy"]
    mdAry = [ary1, ary2];

// convert to form [[d, ee], [a, rr], ..]
var tmp = mdAry[0].map(function (e, i) {
    return [e, mdAry[1][i]];
});
// sort this
tmp.sort(function (a, b) {return a[0] > b[0];});
// revert to [[a, b, ..], [rr, mm, ..]]
tmp.forEach(function (e, i) {
    mdAry[0][i] = e[0];
    mdAry[1][i] = e[1];
});
// output
mdAry;
// [["a", "b", "c", "d"], ["rr", "mm", "yy", "ee"]]
于 2013-05-23T01:58:02.977 に答える
0

あなたの例では、結果は(私が正しく理解していれば)

a rr
b mm
c yy
d ee

したがって、これは仕事に必要です:

Array.prototype.sortRelated = function(related) {
    var clone = this.slice(0), 
        sortedRelated = [];
    clone.sort();

    for(var i = 0; i < this.length; i ++) {
        sortedRelated[clone.indexOf(this[i])] = related[i];
    }

    return sortedRelated;
}

var ary1 = new Array("d", "a", "b", "c");
var ary2 = new Array("ee", "rr", "mm", "yy");

var sorted = ary1.sortRelated(ary2);

ここでの動作デモ: http://jsfiddle.net/cwgN8/

于 2013-05-23T01:51:17.397 に答える
0

それらを 2 つのプロパティを持つ単一のオブジェクトに「マージ」し、最初のプロパティで並べ替えてから、最後に分離することができます (こちらのデモを参照)。

function sortBoth(ary1, ary2) {
    var merged = [];
    for (var i=0; i < ary1.length; i++) merged.push({'ary1': ary1[i], 'ary2': ary2[i]});
    merged.sort(function(o1, o2) { return ((o1.ary1 < o2.ary1) ? -1 : ((o1.ary1 == o2.ary1) ? 0 : 1)); });
    for (var i=0; i < merged.length; i++) { ary1[i] = merged[i].ary1; ary2[i] = merged[i].ary2; }
}

var ary1 = new Array("d", "a", "b", "c");
var ary2 = new Array("ee", "rr", "mm", "yy");

console.log(ary1);
console.log(ary2);

sortBoth(ary1, ary2);

console.log(ary1);
console.log(ary2);

出力:

[ "d",  "a",  "b",  "c"]
["ee", "rr", "mm", "yy"]
[ "a",  "b",  "c",  "d"]
["rr", "mm", "yy", "ee"] 
于 2013-05-23T01:52:42.993 に答える