簡體   English   中英

對具有負數和正數的字符串數組進行排序

[英]Sort array of strings with negative and positive numbers

首先,我無法找到解決整個問題的問題。

我曾經比較這樣的數組:

array.sort((a, b) => {
    return a.localeCompare(b, undefined, {numeric: true, sensitivity: 'base'})
})

但我意識到它不適用於像['a', 'A', 'B', -1.50', '0', '1.50', '-2', '2']這樣的數組。

預期輸出將是: ['-2', '-1.50', '0', '1.50', '2', 'A', 'a', 'B']

我有一些骯臟的想法來實現它。 但也許有一個干凈簡單的方法。

您可以通過獲取所需屬性的增量來預先進行比較。 這樣可以保存數值的順序。

 console.log( ['a', 'A', 'B', '-1.50', '0', '1.50', '-2', '2', 'D'] .sort((a, b) => a - b || a.localeCompare(b, undefined, {sensitivity: 'base'})) ); 

numeric: true選項可以省略,因為在表達式的左側不會有兩個數字要比較。

您應該使用isNaN方法來檢查是否比較數字字符串。 如果是,建議不要使用localeCompare ,需要使用Number(a) - Number(b)

 array = ['a', 'A', 'B','-1.50', '0', '1.50', '-2', '2'] array.sort((a, b) => { return !isNaN(a) && !isNaN(b) ? Number(a)-Number(b) : a.localeCompare(b, undefined, { sensitivity: 'base'}); }) console.log(array); 

因為在Javascript中-運算符僅定義為數字減法,所以操作數將被強制轉換為Number 所以你可以簡單地使用:

array.sort((a, b) => {
  return a - b || a.localeCompare(b, undefined, { sensitivity: 'base'});
})
const customSort = (array) => {
    return array.sort((a, b) => {

        let r = /^-?\d+(?:\.\d+)?$/;

        if (r.test(a) && r.test(b))
        {
            return a - b;
        }

        return a.localeCompare(b, undefined, {numeric: true, sensitivity: 'base'})
    })
}

console.log(customSort(['a', 'A', 'B', '-1.50', '0', '1.50', '-2', '2']));
// => [ '-2', '-1.50', '0', '1.50', '2', 'a', 'A', 'B' ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM