2016-03-26 11 views
3

stationsというmutlripleオブジェクトがあります。各局にはmoneyというプロパティがあります。オブジェクトに値でソートされたインデックスの配列を作成する方法

stations[0].money = 2000 
stations[1].money = 500 
stations[2].money = 1200 
stations[3].money = 2200 

私は、ステーションインデックスの配列を作成する(この例では、0,1,2及び3)が、各ステーションはお金で昇順たお金のammountでソート。 だから私は持っていたい:

var moneyArray = [1, 2, 0, 3] 

それを行うための最もエレガントな方法は何か?

答えて

3

あなたはインデックスの正常配列(ループが生成し、好ましくは)で開始して、stationsアレイ内のそれぞれのインデックス位置にあるオブジェクトの値によってそれを並べ替えることができ:

[0, 1, 2, 3].sort(function(ai, bi) { 
    return stations[ai].money - stations[bi].money; 
}) 
+0

あなたは私を打つ。添え字の配列は 'stations.map((_、i)=> i)' – Oriol

+0

で生成することもできますし、 'Object.keys(stations).sort'を使うこともできます。 – Nickolay

+0

私にとっては確かに最高の解決策です:) – Kalreg

1

あなたはここで見ていることがあります。あなたはそれをこの方法で行うことができます一時変数を使用することによりSorting with map

// the array to be sorted 
 
var stations = [ 
 
     { money: 2000 }, 
 
     { money: 500 }, 
 
     { money: 1200 }, 
 
     { money: 2200 }, 
 
    ]; 
 

 
// temporary array holds objects with position and sort-value 
 
var mapped = stations.map(function (el, i) { 
 
    return { index: i, value: el.money }; 
 
}) 
 

 
// sorting the mapped array containing the reduced values 
 
mapped.sort(function (a, b) { 
 
    return a.value - b.value; 
 
}); 
 

 
// container for the resulting order 
 
var result = mapped.map(function (el) { 
 
    return stations[el.index]; 
 
}); 
 

 
// get the wanted keys 
 
var keys = mapped.map(function (el) { 
 
    return el.index; 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>'); 
 
document.write('<pre>' + JSON.stringify(keys, 0, 4) + '</pre>');

0

を。それ以外の場合は、メインデータを変更する余裕があれば、一時変数を削除することができます。

var stations = [{money :2000},{money :500},{money :1200},{money :2200}] 
 

 
var tempArray = stations.slice(); 
 

 
tempArray.forEach(function (value, i) { 
 
    value.index = i; 
 
}); 
 

 
tempArray.sort(function(a, b){return a.money-b.money}); 
 

 
var finalResult = tempArray.map(function(a) {return a.index;}); 
 

 
document.write(JSON.stringify(finalResult));

+0

配列を 'tempArray'に複製することを意味しましたか?その後、 '.slice()'コールが欠落しました。あなたの現在のコードは 'ステーション'配列とその中の各オブジェクトを変更します*。 – Bergi

+0

@Bergiありがとうございました。私はそれを加えた –

関連する問題