2012-07-09 20 views
1

我有一個對象模型,看起來像這樣:JavaScript的自定義排序時,數組的部分沒有數據

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屬性。正因爲如此,這種排序似乎並不像預期的那樣工作。例如,如果有值,則按名稱排序,然後根據排序函數將所有沒有名稱的值。

這樣做的工作方式是什麼?感謝您的建議。

+1

會像'return(a ['TheName'] || 0) - (b ['TheName'] || 0);'工作(因爲您使用'-',我假設值是數字)? – 2012-07-09 16:39:21

+1

您正在使用'a - b'進行排序,這會導致大多數字符串出現'NaN'。如果兩者都是空字符串,您將得到一個合法值'0' – Esailija 2012-07-09 16:40:02

+0

@Rocket:no,它們是字符串。 – frenchie 2012-07-09 16:48:29

回答

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); }; 

UPDATE:如果你需要看最後所有時間的空值...

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']); 
    } 
} 

(是這實際上更易讀?)

+0

我收到一個錯誤對象MrJones沒有方法localCompare。 – frenchie 2012-07-09 16:47:36

+0

你能展示一個你正在使用的實例嗎? – raina77ow 2012-07-09 16:51:09

+2

@frenchie:這裏有一個* E *:[local_e_Compare(https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/localeCompare) – Bergi 2012-07-09 16:51:11

0

自定義排序函數必須返回一個數(<,或者=> 0)。如果它返回任何其他東西(如NaN),則行爲是「特定於實現的」(根據標準),這意味着它通常會中斷並且什麼都不排序。

我不確定你想要排序的是什麼('TheName'聽起來像字符串,你的函數是數字),但你應該只返回1,如果該屬性不存在b和-1如果一個;那麼您的無財產物品將被排序到數組的末尾。