iT邦幫忙

0

前端處理中文物件排序問題

  • 分享至 

  • xImage

想問一下,在實現中文排序時,為什麼陣列排序可以正常,但到了物件以後就會錯誤?

下面程式碼是個範例

const arr = ['第四冊', '第一冊', '第二冊', '第三冊', '首冊', '總複習']

const arr2 = [
  {
    title: '第四冊'
  },
  {
    title: '第ㄧ冊'
  },
  {
    title: '第二冊'
  },
  {
    title: '第三冊'
  },
  {
    title: '首冊'
  },
	{
    title: '總複習'
  },
  
]

const test = arr.sort((a, b)=> a?.localeCompare(b))
const test2 = arr2.sort((a, b)=> a.title?.localeCompare(b.title))

console.log(test, 'test')
console.log(test2, 'test2')

test 會是正常:

["首冊", "第一冊", "第二冊", "第三冊", "第四冊", "總複習"]

test2 卻呈現不規則的情況:

[
    { title: "首冊" },
    { title: "第二冊" },
    { title: "第三冊" },
    { title: "第四冊" },
    { title: "第ㄧ冊" },
    { title: "總複習" }
]

請問為什麼會這樣,又該如何解決?

iT邦新手 4 級 ‧ 2023-07-14 13:27:15 檢舉
「ㄧ」的內碼(U+3127)
「一」的內碼(U+4E00)
上下兩個不同~
「四」的內碼(U+56DB)
所以造成"ㄧ"會排在"四"後面
janlin002 iT邦好手 1 級 ‧ 2023-07-14 14:05:15 檢舉
學到了,謝謝~~
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2023-07-14 12:49:52
最佳解答

目前看來,二個排序是正確的。
我猜測你會認為不正確的原因是因為「第ㄧ冊」

在文字序列上。「ㄧ」這個文字是在「一二三...」的後面沒錯。
你要注意你第二個的「ㄧ」並不是「一」。
(您可以用內碼表轉換數值查看就知道)

所以就這兩個排序而言。並無任何不規則。而是照著規則排序的。

janlin002 iT邦好手 1 級 ‧ 2023-07-14 14:04:45 檢舉

原來是這樣,那想請問一下,如果 arr2 的部分是由後端給的資料形式,有辦法透過前端將所有內碼都轉換成我們認知的文字序列嗎?

例如:
第ㄧ冊 改成 第一冊

淺水員 iT邦大師 6 級 ‧ 2023-07-14 14:18:31 檢舉

說明一下為什麼會有兩個一
因為一個是國字的一,另外一個是注音符號用的

所以如果確定你們文章都不會出現注音符號
直接用取代的方式就可以了

janlin002 iT邦好手 1 級 ‧ 2023-07-14 14:22:44 檢舉

喔喔瞭解了,感謝!!

我要發表回答

立即登入回答