首页 > 解决方案 > 当某些值有点时,如何按字母数字对数组进行排序?

问题描述

我很想知道如何对这种值进行排序:

let sizesArray = 

    [
      "Size : US 5.5Y (EU 38)",
      "Size : US 6.5Y (EU 39)",
      "Size : US 4.5Y (EU 36.5)",
      "Size : US 6Y (EU 38.5)",
      "Size : US 7Y (EU 40)",
      "Size : US 4Y (EU 36)",
    ]

我是这样排序的:

// Create rules for sorting product sizes.
const sortAlphaNum = (a, b) => a.localeCompare(b, 'en', { numeric: true})

// Sorting product Sizes.
let sortedSizes = sizesArray.sort(sortAlphaNum);

结果 :

[
   "Size : US 4.5Y (EU 36.5)",
   "Size : US 4Y (EU 36)",    
   "Size : US 5.5Y (EU 38)",  
   "Size : US 6.5Y (EU 39)",  
   "Size : US 6Y (EU 38.5)",  
   "Size : US 7Y (EU 40)"
]

如您所见, 4Y 排在 4.5Y 之后!只是因为当它将 4" Y " 与 4" . "5Y 进行比较时,点在所有 alpha 之前。怎么做反转?

我也使用的格式:

"US 5.5 (EU 38)"
"US 5.5Y (EU 38)"
"W US 9.5 / US 8 (EU 41)"
"US 4.5 (EU 36 2/3)"

它适用于除第二个之外的所有人。

提前致谢。:)

标签: javascriptsorting

解决方案


如果您的字符串始终采用这种格式,您可以使用一点正则表达式来解析数字并将它们作为数字而不是字符串进行比较。

let sizesArray = [
  "Size : US 5.5Y (EU 38)",
  "Size : US 6.5Y (EU 39)",
  "Size : US 4.5Y (EU 36.5)",
  "Size : US 6Y (EU 38.5)",
  "Size : US 7Y (EU 40)",
  "Size : US 4Y (EU 36)",
]


sizesArray.sort((a, b) => {
  return +a.match(/US\s([\d\.]*)/)[1] - +b.match(/US\s([\d\.]*)/)[1];
});

console.log(sizesArray);

PS。将对数组进行就地sort排序,因此将内存分配给将引用与原始变量相同的数组的新变量没有多大意义:

// sortedSizes === sizesArray
// Both arrays are exactly the same object
let sortedSizes = sizesArray.sort(sortAlphaNum)

推荐阅读