2012-04-09 7 views
5

を維持し、ソート私はランク1,2,3でソートしようとしている..しかし、関連付けられた名前を保持していjavascriptオブジェクトの配列、私は2つの配列のように示すとjavascriptオブジェクトを持っているキー

var Object = {'name': [Matt, Tom, Mike...], 'rank': [34,1,17...]}; 

ランク。

Object.name[0] // tom 
Object.rank[0] // tom's rank of 1. 

並べ替えが容易になるようにオブジェクトを再設定する必要がありますか?

私は現在ランクを注文する

Object.rank.sort(function(a,b){return a-b}); 

を使用していますが、名前はそれにとどまりません。

すべてのお役に立ちました。ありがとう!

+1

より良い別のフォーマットとオブジェクトのデータを保持するために、あなたのオブジェクトを変更するには、悪い変数名です。 – epascarello

+3

'var Object = {....'本当に? – Mohsen

+0

私のオブジェクトはオブジェクトという名前ではありません..私はそれがより簡単になると思った...推測しない.. – mattyd

答えて

4

はい、再設定してください。その後

var people = [{name:"Matt", rank:34}, {name:"Tom", rank:1}, {name:"Mike", rank:17}]; 

あなたはこのように並べ替えることもできます:あなたはこの代わりに持っていたと言うあなたはパラレルのリストを持っているので

people.sort(function(a, b) { 
    return a.rank - b.rank; 
} 

編集を

、ちょうどそれらを一緒にジップ:

var people = []; 
for (var i = 0; i < Object.name.length; i++) { 
    people.push({name:Object.name[i], rank:Object.rank[i]}); 
} 
+0

ありがとう!私はこれをもっと直感的なやり方で行う必要があることを知っていました。 – mattyd

+0

です。私はあなたが見せているように、私の人々のオブジェクトを持っている[{name:val}、{name:val}]、しかし、私はalert(people.name [0])とvarの間で、関数の外で作成され、非同期で警告することに苦労しています:false POST、canコード外では使用しないでください...任意のアイデアですか? – mattyd

+1

これは実際に 'people [0] .name'でしょう。 – jpsimons

0
あなたは、各ソート操作のために、インデックスはどこのランクの配列の反復ごとに何が来るのか覚えて独自のソート関数を記述する必要があります

。名前配列のソースインデックスから宛先インデックスへの同じ移動を行います。 (編集)私の頭の上からこのための1つのalgortihmは、気泡です、それを見てください。

他のオプションは、「マップ」コレクションの実装のいくつかの種類を探すことです。

1

アレイのrank配列のi番目のオブジェクトにnamesという配列のi番目のオブジェクトが接続されている場合は、そのように表現する必要があります。 namerank:これは意味、あなたはPerson(または何それはある)二つのプロパティを持つオブジェクトを使用する必要があります。

// person constructor 
function Person(name, rank) { 
    this.name = name; 
    this.rank = rank; 
} 

// create the object with the array 
var myObject = { 
    myArray: new Array() 
}; 

// populate the array 
myObject.myArray.push(new Person('Matt', 34)); 
myObject.myArray.push(new Person('Tom', 1)); 
myObject.myArray.push(new Person('Mike', 17)); 

// sort the Person objects according to their ranks 
myObject.myArray.sort(function(a, b) { 
    return b.rank - a.rank;  
}); 
+0

素晴らしい!堅実に見える。病気はそれを行ってください! – mattyd

+0

この場合、特殊なPersonオブジェクトを作成することが一般的なオブジェクトよりも優れているかどうかは不明です。私はあなたがそれに対して 'instanceof'をしたいかもしれない行を後で考えていますか? – jpsimons

+0

@darkporterコードのスニペットから伝えるのは難しいですね。たぶん特別なPersonオブジェクトは、さらに機能性のために便利になるでしょう、おそらく全くないでしょう... – Imp

2

実世界のオブジェクト:

o = {name: ['Matt', 'Tom', 'Mike'], rank: [34,1,17]}; 

よりよいデータ構造の配列を作成します。ランク別

var arr =[]; 
o.name.forEach(function(name, i){ 
     arr.push({name: name, rank: o.rank[i]}) 
}); 

並び替え:名前で

arr.sort(function(a,b){return a.rank - b.rank}); 

並べ替え:

arr.sort(function(a,b){return a.name- b.name}); 

戻って元のデータ構造に戻す:

o = {name:[], rank:[]} 
arr.forEach(function(item){ 
    o.name.push(item.name); 
    o.rank.push(item.rank); 
}); 
+0

forEachは素晴らしいです。それはMozillaの拡張版ですか、それともクロスブラウザですか? – jpsimons

+0

['ForEach'](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Array/forEach)は、ほとんどのブラウザで利用でき、古いブラウザではフォールバックが可能です。 – Mohsen

+0

ありがとうMohsen!私はあなたのforEachメソッドが現在のオブジェクトを再構成するのに最適です – mattyd

関連する問題