2011-06-20 4 views
3

1つの配列をソートしようとしていますが、2番目の配列は最初の配列と同期しています。JavaScript配列をソートしますが、2番目の配列を同期させてください

例:私はこのように見えるようにアレイに必要なソート後

var a1 = ["human", "animal", "plant"]; 
var a2 = ["person", "beast", "nature"]; 

a1.sort(); 

a1 = ["animal", "human", "plant"]; 
a2 = ["beast", "person", "nature"]; 

はたぶん、カスタムソート機能を使用して、これを行う簡単な方法はありますか?

+1

それは完璧取得するには、戻り値で遊んでデータは悪い考えです。オブジェクトの配列 '{{name: 'human'、タイプ: 'person'}、{name: 'animal'、タイプ: 'beast'}]'を使用すると、同期について心配する必要はありません。構造を同期させる必要がある場合は、DRY原則に従わないことになります。 –

答えて

3

あなたは、ソート前に配列を圧縮し、ソート後にそれらを解凍できます。

var a = ["human", "animal", "plant"], 
    b = ["person", "beast", "nature"], 
    zipped = []; 

// zip 
for (var i=0; i<a.length; i++) 
{ 
    zipped.push({a: a[i], b: b[i]}); 
} 

zipped.sort(function (x, y) 
{ 
    return x.a - y.a; 
}); 

// unzip 
var z; 
for (i=0; i<zipped.length; i++) 
{ 
    z = zipped[i]; 
    a[i] = z.a; 
    b[i] = z.b; 
} 

を...しかし、私はduffymoさんがあなたのためのより良い提案だ@だと思います。オブジェクト/ハッシュ/連想配列/マップを使用します。

var a = [{key: 'human', value: 'person'}, 
     {key: 'animal', value: 'beast'}, 
     {key: 'plant', value: 'nature'}]; 

a.sort(function (x, y) 
{ 
    return x.key - y.key; 
}); 
+0

アレイをぴったりと収めました!私はそのようなことをすることは決して考えなかったでしょう。助けてくれてありがとう! –

0

私は連想配列を使用し、キーをソートします。それがここにあります。私は連想配列がアイデアのより良いカプセル化だと思う。

3

このような何か(未テスト)を試してみてください。

a1.sort(function(a, b) { 
    if (a > b) { 

     // swap a2[0] and a2[1] 
     var tmp = a2[0]; 
     a2[0] = a2[1]; 
     a2[1] = tmp; 

     return 1 
    } else if (a < b) { 
     return -1 
    } else { 
     return 0 
    } 
}); 

Live DEMO

そのような何か、あなたのための2つの平行配列を持つ

+0

ソート機能を持たせることで、グローバル配列を修正するだけです...しかし、これはOPが尋ねるものを行う最も簡単な方法です –

+0

このメソッドは、配列の実際の実装についての前提に基づいています.sort'コードは一般的に間違っています:現在比較されている2つの項目のインデックスが '0'と' 1'であると仮定してはいけません。あなたのサンプルの修正を見てください:[modified demo](http://jsfiddle.net/y6Lwfog8/)。 –

関連する問題