2

私はjsが初めてで、オブジェクトの配列を2つのフィールドでソートしようとしています-最初のプロパティから始めて、次に2番目のプロパティで。どちらのプロパティも数値です。

データは次のとおりです。

var homes = [{
   "h_id": "3",
   "minimumorder": "12",
   "price": "17"
    }, {
   "h_id": "4",
   "minimumorder": "1",
   "price": "20"
}, {
   "h_id": "5",
   "minimumorder": "1",
   "price": "18.10"
}

配列にはさらにオブジェクトがあります。これは単純化された例です。以下のコード ALMOST でそこにたどり着きますが、minimumorder プロパティの場合、6 の代わりに 1 の後に 12 を置きます。

cmp = function(a, b) {
    parseFloat(a);
    parseFloat(b);
    if (a > b) return +1;
    if (a < b) return -1;
    return 0;
}

homes.sort(function(a, b) { 
    return cmp(a.minimumorder,b.minimumorder) || cmp(a.price,b.price)
})

ここでjsFiddle 。

私はこれを理解しようと何時間もグーグルでいじくり回してきたので、どんな助けも大いに感謝します。

4

2 に答える 2

4

a解析された値をandに再割り当てする必要がありますb

a = parseFloat(a);
b = parseFloat(b);

それ以外の場合は、文字列を比較することになり、単語が辞書で後に来るように、字句的に12後に発生します。1ata

フィドルを更新しました。

于 2013-07-12T21:13:43.323 に答える
0

良い、

次のようなコードを使用する必要があります。

function sortHomes(homes)
{
 var temp_homes = new Array();
 var new_homes = new Array();

 for(var i = 0; i < homes.length; i++) temp_homes[i] = homes[i];

 var maximum = 0, minimum;

 for(i = 0; i < temp_homes.length; i++) maximum = Math.max(maximum, temp_homes.minimumorder);

 var min_price, j, k, indexes, price_indexes;

 for(i = 0; i < temp_homes.length; i++){
  minimum = maximum;
  for(j = 0; j < temp_homes.length; j++){
   minimum = Math.min(minimum, temp_homes[j].minimumorder);
  }
  indexes = getIndexes(temp_homes, minimum, "minimumorder");
  if(indexes.length == 1){
   new_homes.push(temp_homes[indexes[0]]);
   temp_homes[indexes[0]].minimumorder = maximum + 1;
  }
  else{
   for(j = 0; j < indexes.length; j++){
    min_price = maximum;
    for(k = 0; k < indexes.length; k++){
     min_price = Math.min(min_price, temp_homes[indexes[k]].price);
    }
    price_indexes = getIndexes(temp_homes, min_price, "price");
    for(k = 0; k < price_indexes.length; k++){
     new_homes.push(temp_homes[price_indexes[k]]);
     temp_homes[price_indexes[k]].price = maximum + 1;
    }
   }
  }
 }
}

function getIndexes(arr, el, name)
{
 var indexes = new Array();
 for(var i = 0; i < arr.length; i++) if(arr[i][name] == el) indexes.push(i);
 return indexes;
}

それはうまくいくはずです。そうでない場合は、その旨をお知らせください。

ああ、家を並べ替えるには、次を使用します。

家 = sortHomes(家);

于 2013-07-12T21:43:25.520 に答える