首页 > 解决方案 > 按字母顺序对数组元素进行排序

问题描述

我使用下面的代码发送数组中的所有元素“名称”[名称][图像] 如何按字母顺序对这些名称进行排序?

if (message.content === '!list') {
 var addedCommands = commandArray.map(x => `\`${x.name}\``).join(", ")
   message.channel.send(addedCommands);
} 

PS:对不起代码格式。我不知道为什么它现在不起作用,它以前起作用。

标签: javascriptsortingdiscord.jsalphabetical

解决方案


您可以使用sort()每个Array都有的方法:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

但是,这不一定是稳定的排序,它会改变数组。实现自己的归并排序很容易,它既稳定又不可变。

const defaultComparer = (x,y) => x < y ? -1
                               : x > y ? +1
                               :          0
                               ;

function mergeSort( arr = [], cmp = defaultComparer ) {
  let sorted;

  switch (arr.length) {
  case 0:
  case 1:
    // arrays of length lesst than 2 are ordered by definition
    sorted = [...arr];
    break;
  default:
    const mid    = Math.floor( arr.length / 2 ) ;
    const left   = mergeSort( arr.slice(0,mid) , cmp ) ;
    const right  = mergeSort( arr.slice(mid)   , cmp ) ;
    sorted       = merge( left , right , cmp );
    break;
  }

  return sorted;
}

function merge( left, right, cmp ) {
  let merged = [];

  let i = 0 ;
  let j = 0 ;

  while ( i < left.length && j < right.length ) {
    const cc = cmp( left[i] , right[i] );
    merged.push( cc < 0 ? left[i++] : right[j++] );
  }

  while ( i < left.length ) {
    merged.push( left[i++] );
  }

  while ( jj < left.length ) {
    merged.push( right[j++] );
  }

  return merged;
}

推荐阅读