3

次のようにソートする方法を指定できることを発見array.sort()し、見ました:(http://www.w3schools.com/jsref/jsref_sort.aspからの例)

var points = [40,100,1,5,25,10];
points.sort(function(a,b){return a-b});

配列が小さいため、バブルソートを使用して手動でソートを行ってきましたが、array.sort()これを代わりに使用できるかどうか疑問に思っていました:

// Sort rowCategories[i] by rowWidth[i]
swapped = true;
while (swapped) {
    swapped = false;
    for (var i = 0; i < rowCategories.length-1; i++) {
        if (rowWidth[i] < rowWidth[i+1]) {
            var swap = rowCategories[i];
            rowCategories[i] = rowCategories[i+1];
            rowCategories[i+1] = swap;
            swap = rowWidth[i];
            rowWidth[i] = rowWidth[i+1];
            rowWidth[i+1] = swap;
            swapped = true;
        }
    }
}

組み込みの並べ替えで同等の作業を行うには、何を記述すればよいでしょうか?

4

4 に答える 4

2

配列をマルチソートする方法がありますが、私はオブジェクトの配列の方が好きです。マルチソートは次のとおりです。

function multisort(sortBy,otherArrays){
  var keys=[],i,tmpKeys;
  sortBy.sort(function(a,b){
    var ret=(a>b)?1:(a<b)?-1:0;
    // storing the return values to be used for the other arrays
    keys.push(ret);
    return ret;
  });
  for(i=0;i<otherArrays.length;i++){
    // copy the stored retun values
    tmpKeys=keys.concat([]);
    otherArrays[i].sort(function(){
      // return the saved values based on sortBy array's sort
      return tmpKeys.splice(0,1);
    });
  }
}

var arr1=[1,2,3],
arr2=[5,6,7],
reverse=["c","b","a"];
multisort(reverse,[arr1,arr2])
console.log(arr1);
console.log(arr2);
console.log(reverse);

オブジェクト キーによる並べ替え:

var arr=[
  {id:1,col1:3,col2:2},
  {id:2,col1:2,col2:2},
  {id:3,col1:1,col2:1}
];

function sortBy(arr,keys){
  var i=0;
  arr.sort(function(a,b){
    var i=0;
    while(a[keys[i]]===b[keys[i]]&&i<keys.length){
      i++;
    }
    return (keys.length===i)?0:(a[keys[i]]>b[keys[i]])?1:-1;
  });
}
//sort by col2 then col1
sortBy(arr,["col2","col1"]);
console.log(arr);
//sort by id
sortBy(arr,["id"]);
console.log(arr);
于 2013-07-02T01:54:45.740 に答える
1

ビルトインはsort()一度に 1 つの配列のみを並べ替えることができ、比較はインデックスではなく値に基づいて行われます。

あなたがしていることは、PHPのarray_multisort()機能に似ています。php.jsライブラリをロードすると、この関数の実装が含まれます。実装はこちらです。

于 2013-07-02T01:45:54.687 に答える
1

これには少し変更が必要です。2 つの配列を格納する代わりに、2 つの属性を持つオブジェクトを含む 1 つの配列を格納します。次に、このようなことができます。

arr.sort(functiona(a,b){return a.rowWidth - b.rowWidth});

オブジェクトには属性 rowWidth および rowCatagories が含まれている必要があります

于 2013-07-02T01:48:51.350 に答える
0

実際、並べ替え関数が使用するバニラは、ブラウザー JS エンジンの実装に依存します。たとえば、Mozilla は MergeSort を使用していると思います。

デフォルトでは、配列アイテムを文字列として比較します。その他の考慮事項が必要な場合は、独自の比較関数をソートに渡す必要があり、関数はアイテムの比較結果を示す負、0、または正の数値を返す必要があります。

あなたの代わりにこのソート関数を使用できます。これははるかに高速です。

于 2013-07-02T01:45:21.403 に答える