使用String.localeCompare对混合项进行排序时如何更改排序顺序?

Un1*_*Un1 6 javascript arrays sorting

假设我们有一组具有混合name值的对象(nums,cyrillic,english):

(如果代码不适合你,undefined改为'ru',它也会改变排序结构)

let ascending = true

var items = [
  {name: 'c', value: ''}, 
  {name: 'b', value: ''}, 
  {name: 'a', value: ''}, 
  {name: '?', value: ''}, 
  {name: '?', value: ''}, 
  {name: '41', value: ''}, 
  {name: '?', value: ''}, 
  {name: '?', value: ''}, 
  {name: '0', value: ''}, 
  {name: '31', value: ''}, 
  {name: '4', value: ''}, 
  {name: '?', value: ''}
]

items.sort(function (a, b) {
  // ascending order
  if (ascending) {
    return a.name.localeCompare(b.name, undefined, { numeric: true });
  }
  // descending order
  else {
    return b.name.localeCompare(a.name, undefined, { numeric: true });
  }
})

console.log(items);
Run Code Online (Sandbox Code Playgroud)

目前的结果

我按升序获得排序数组,结构如下:

  • Nums(升序)
  • 英语(升序)
  • 非英语(升序)

结果时间ascending = true:

{name: "0", value: ""}
{name: "31", value: ""}
{name: "4", value: ""}
{name: "41", value: ""}
{name: "a", value: ""}
{name: "b", value: ""}
{name: "c", value: ""}
{name: "?", value: ""}
{name: "?", value: ""}
{name: "?", value: ""}
{name: "?", value: ""}
{name: "?", value: ""}
Run Code Online (Sandbox Code Playgroud)

期望的结果

我需要它能够在降序时对数组进行排序ascending = false保留结构:

  • Nums(降序)
  • 英语(降序)
  • 非英语(降序)

需要的结果是ascending = false:

{name: "41", value: ""}
{name: "31", value: ""}
{name: "4", value: ""}
{name: "0", value: ""}    
{name: "c", value: ""}
{name: "b", value: ""}
{name: "a", value: ""}
{name: "?", value: ""}
{name: "?", value: ""}
{name: "?", value: ""}
{name: "?", value: ""}
{name: "?", value: ""}
Run Code Online (Sandbox Code Playgroud)

问题

当我改变ascending = false并改变它的位置时b.name,a.name只需翻转整个阵列而不是翻转它们的"类别"(nums,english,cyrillic)中的值.

我不确定如何正确地做到这一点.我的意思是,反转数组会反转这些值,所以我应该在翻转数组后重组数组"类别"吗?这样的事情可能是:

  • 获取带有数字的所有对象isNaN()并将它们移到顶部

  • 然后得到只包含a-z在的项目[0]并将它们移到数字"类别"下面

  • 其他一切都停留在底部

Un1*_*Un1 0

之后,我只需将排序的“类别”移动到所需的位置即可重组翻转的数组:

\n\n
    \n
  • 数字(降序)
  • \n
  • 英语(降序)
  • \n
  • 非英语(降序)
  • \n
\n\n

\r\n
\r\n
let ascending = false\r\n\r\nvar items = [\r\n  {name: \'c\', value: \'\'}, \r\n  {name: \'b\', value: \'\'}, \r\n  {name: \'a\', value: \'\'}, \r\n  {name: \'\xd0\xb4\', value: \'\'}, \r\n  {name: \'\xd0\xb2\', value: \'\'}, \r\n  {name: \'41\', value: \'\'}, \r\n  {name: \'\xd0\xb0\', value: \'\'}, \r\n  {name: \'\xd0\xb1\', value: \'\'}, \r\n  {name: \'0\', value: \'\'}, \r\n  {name: \'31\', value: \'\'}, \r\n  {name: \'4\', value: \'\'}, \r\n  {name: \'\xd0\xb3\', value: \'\'}\r\n]\r\n\r\nitems.sort(function (a, b) {\r\n  // ascending order\r\n  if (ascending) {\r\n    return a.name.localeCompare(b.name, undefined, { numeric: true });\r\n  }\r\n  // descending order\r\n  else {\r\n    return b.name.localeCompare(a.name, undefined, { numeric: true });\r\n  }\r\n})\r\n\r\n\r\nif (ascending == false) {\r\n  var englishAlphabet = "abcdefghijklmnopqrstuvwxyz"\r\n  let nums = []\r\n  let english = []\r\n  let other = []\r\n\r\n  items.forEach(element => {\r\n    if (isNaN(element.name[0]) == false) {\r\n      nums.push(element)\r\n    }\r\n    else if (englishAlphabet.includes(element.name[0].toLowerCase())) {\r\n      english.push(element)\r\n    }\r\n    else {\r\n      other.push(element)\r\n    }\r\n  });\r\n\r\n  let restructuredItems = nums.concat(english).concat(other)\r\n\r\n  console.log(\'BEFORE RESTRUCTURING\', items);\r\n  console.log(\'AFTER RESTRUCTURING: \', restructuredItems);\r\n}
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n