2017-10-17 71 views
1

我想排序我的JSON輸出。Javascript ES6自定義排序方法無法一直工作

我爲我自己的排序方法,你可以在這裏看到:

const sortAsc = (propertyName) => (a, b) => a[propertyName] === b[propertyName] ? 0 : a[propertyName] < b[propertyName] ? -1 : 1; 
const sortDesc = (propertyName) => (a, b) => a[propertyName] === b[propertyName] ? 0 : a[propertyName] < b[propertyName] ? 1 : -1; 

我叫它像這樣:

asc(value) { 
    this.result.sort(this.sortAsc(value)); 
} 

它的工作原理有點但當我對它進行排序它不」總是對的。

看看這個小GIF: https://gyazo.com/5f590f7c921eb1cb3bc4138f85c2162b

正如你看到它並沒有真正與ID工作。它在Naam上升序(名稱在荷蘭)但是當降序時,首先給出2個名字,以v & k開頭。這是爲什麼?

那麼,如果這是什麼東西很難被修復它不是一個真正的問題。只要它可以對數字和字符串進行排序。

還有一點要注意的是,我正在使用Angular 4.4.4。我搜索了一個內置的sort/orderBy函數,但發現這不是內置的。但是,如果有什麼我可以使用的Angular提供更容易,我會很樂意使用它!

編輯:

我的新方法:

sortAsc = (propertyName) => (a, b) => a[propertyName].localeCompare(b[propertyName]); 
+0

比較字符串時,您可能想使用['String#localeCompare'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare)。這也可以讓你配置小寫/大寫單詞的排序方式。 –

+0

'v'和'k'可能是區分大小寫的東西。在某些數據庫中,似乎有類似的問題,其中小寫'a'被認爲是大寫的'Z'。也許嘗試在比較函數中使用'.toLower()'? – Tor

+0

它看起來像工作得很好。默認情況下,字符串不等式使用unicode代碼點(其中包含ASCII),所以按降序排列,您使用小寫字母,然後使用大寫字母。 –

回答

0

你可以使用與選項:

localeCompare()方法返回一個數字,指示參考串是否之前或之後來到或相同的排序順序給定的字符串。

新的localesoptions參數讓應用程序指定應該使用排序順序的語言並自定義函數的行爲。在較早的實現中,忽略localesoptions參數,所使用的語言環境和排序順序完全取決於實現。

const sortAsc = propertyName => (a, b) => 
    a[propertyName].localeCompare(b[propertyName], undefined, { numeric: true, sensitivity: 'base' }); 


const sortDesc = (propertyName) => (a, b) => 
    -a[propertyName].localeCompare(b[propertyName], undefined, { numeric: true, sensitivity: 'base' }); 
+0

這真的很好知道。我從未注意過之前的選擇。然而,你有一個問題 - 數字沒有'localeCompare'方法。使用'a [propertyName] .toString()。localeCompare()'似乎工作正常。 –

+0

對,字符串方法需要轉換。 –

+0

我沒有看到在通常的關係運算符上使用'localCompare'的好理由 - 它們在字符串上工作得很好。還要注意,'options'在ES6中是新的,並且在舊版瀏覽器中不起作用。 – Bergi

-1

我想你想的ID比較數字,所以你應該使用合適的排序功能,對於像數列:

const sortAsc = (propertyName) => (a, b) => a[propertyName] === b[propertyName] ? 0 : +a[propertyName] < +b[propertyName] ? -1 : 1; 
const sortDesc = (propertyName) => (a, b) => a[propertyName] === b[propertyName] ? 0 : +a[propertyName] < +b[propertyName] ? 1 : -1; 

另一種方法是調整你的表數據數組,ids應該是數字那裏,而不是字符串,在這種情況下,你的排序功能也應該工作。

-1

您的比較功能完全正常。關係運算符可以在數字和字符串兩種情況下工作,沒有理由使用localeCompare

它的工作原理有點類似,但是當我對它進行排序時,它總是不能正確排序:它並不真正與ID一起工作。

看起來對象數組中的id屬性是字符串,所以它們按字典順序進行比較。讓他們成爲實際的數字,他們會被比作數字。

它在Naam上升序但是,首先按降序給出2個名稱,以v開始& k。這是爲什麼?

在gif中很難看到,但看起來這兩個奇怪的排序值是以一個空格開始的 - 它總是先排序。確保你的數據是有效的。

+0

嗨,感謝您的回答,但是它首先以v&k開頭的原因是因爲它們不是小寫字母。將其更改爲localeComare可解決該問題。我不知道我的身份證是否是字符串,我不這麼認爲,因爲我把它們轉換爲這樣的數字:'id: null'。我現在所做的是,我添加了一個新的數字排序方法:'(propertyName)=>(a,b)=> a [propertyName] - (b [propertyName]);'這可能不是最好的解決方案,但代碼看起來很好,可維護,而且速度很快。 –

+0

這是一個TypeScript聲明嗎?我不認爲這是一個演員 - 並且絕對不會發生在你分配實際值的地方(而不是'null')。 – Bergi

+0

是的,我認爲它是TypeScript。嗯...所以,不是演員。那麼它是在C#中:P我對TypeScript,Angular和ES6有點新。 –

相關問題