1

次のようなオブジェクト モデルがあります。

MyObject = {
   TheName: "",
   OtherProps :....
}

これらのオブジェクトの配列があり、カスタム並べ替え関数は次のようになります。

function SortArray() {

  var CustomFunction;

  var CustomSortAsc = function (a, b) {
    return a['TheName'] - b['TheName'];
  }

  var CustomSortDsc = function (a, b) {
    return b['TheName'] - a['TheName'];
  }

  if (SomeCondition) {
      CustomFunction = CustomSortAsc;
  } else {
      CustomFunction = CustomSortDsc;
  }

  SomeArray.sort(CustomFunction);
}

SomeArrayには約 200 ~ 300 個のオブジェクトがあり、問題は、オブジェクトに空のTheNameプロパティがある場合があることです。そのため、並べ替えが期待どおりに機能していないようです。たとえば、値がある場合は名前で並べ替え、並べ替え関数に従って名前のないすべての値を配置します。

これを機能させる方法は何ですか?ご提案いただきありがとうございます。

4

2 に答える 2

4

TheNames は文字列であるため、代わりにlocaleCompareを使用することをお勧めします。

var CustomSortAsc = function(a, b) {
    return (a['TheName'] || '').localeCompare(b['TheName'] || '');
};

そして、私はおそらく次のようにすべてを書きます:

var baseSort = function(a, b) { 
  return (a['TheName'] || '').localeCompare(b['TheName'] || '');
};
var CustomFunction = SomeCondition 
                   ? baseSort 
                   : function(a, b) { return -baseSort(a, b); };

更新:そして、空の値を常に最後に表示する必要がある場合...

var CustomSortAsc = function(a, b) {
    return a['TheName'] === '' 
         ? b['TheName'] === ''
           ? 0
           : 1
         : b['TheName'] === ''
           ? -1
           : a['TheName'].localeCompare(b['TheName']); 
};

...または、必要に応じてif:

if (a['TheName'] === '') {
  if (b['TheName'] === '') {
    return 0;
  } else {
    return 1;
  }
} else {
  if (b['TheName'] === '') {
    return -1;
  } else {
    return a['TheName'].localeCompare(b['TheName']);
  }
}

(これは実際にはもっと読みやすいですか?)

于 2012-07-09T16:43:52.253 に答える
0

カスタム並べ替え関数は、数値 (<、= または > 0) を返す必要があります。それ以外のもの ( など) を返す場合NaN、動作は「実装固有」(標準によると) です。つまり、通常は中断され、何もソートされません。

何をソートしようとしているのかわかりませんが (「TheName」は文字列のように聞こえますが、関数は数値用です)、プロパティが b に存在しない場合は 1 を返し、a にある場合は -1 を返す必要があります。次に、プロパティのないアイテムが配列の最後に並べ替えられます。

于 2012-07-09T16:50:02.493 に答える