【问题标题】:Sorting Array of String in JavaScript [closed]在JavaScript中对字符串数组进行排序[关闭]
【发布时间】:2021-09-08 03:17:43
【问题描述】:

输入:3X,LG,XL,4X 输出:LG,XL,3X,4X

输入:LG,XL,2X,5X,2X 输出:SM,MD,2X,2X,5X

我需要在上面的输入输出中对这个数组进行排序我尝试了很多方法但没有得到这个输出。

【问题讨论】:

  • 如何排序?可以minimal reproducible examples 分享你的“多种方法”吗?
  • 这些排序的逻辑是什么?他们是衣服尺码吗?还有什么?

标签: javascript arrays string sorting


【解决方案1】:

使用数组预先定义一个顺序,并使用它们的位置对大小进行排序。

function sortBySize(toSort = []) {
  const ORDER = ['SM', 'MD', 'LG', 'XL', '2X', '3X', '4X', '5X'];

  return [...toSort].sort((a, b) => {
    const aIndex = ORDER.indexOf(a);
    const bIndex = ORDER.indexOf(b);

    return aIndex - bIndex;
  });
}

【讨论】:

  • 你可以用ORDER.indexOf(a)代替findIndex
  • 很棒的电话@adiga - 用于通过回调找到更复杂的事情。已编辑。
【解决方案2】:

SM 和 LG 之间的比较无法通过标准比较功能进行。没有任何东西向计算机表明 S 小于 L。为了直接比较它们,我们必须教计算机列表中每个项目的含义。您有几种方法可以做到这一点:

  • 为每个可能的选项赋予权重。例如:M = 0, S = -1, XS = -2 等。一旦你设置了这个区别,你可以将数组转换为它的整数值并使用标准排序方法对其进行排序。
  • 指定选项列表及其顺序并与之进行比较。类似于@LMulvey 的回答

【讨论】:

  • "没有任何东西向计算机表明 S 小于 L。" 您传递的比较函数应该这样做。除了按字典顺序排序和非常很少的其他方法外,如果不使用自定义比较器,就没有内在的方式来表达“像这样排序”。因此,计算机知道或不知道什么是无关紧要的。大多数情况下,是我们告诉计算机比较会是什么。
  • @VLAZ 正是我想要表达的意思
【解决方案3】:

我假设您想按从小到大、从“SM”(小)到任意高的 XL 尺寸(如“5X”)的顺序对尺寸标签字符串(如服装)进行排序。默认的 Array.prototype.sort 不适用于该目的(它将按字母顺序对字符串进行排序)。

为此,我们需要创建一个比较两种尺寸的排序函数:

    const stdSizes = ['SM','MD','LG','XL'];
    function compareSizes(left, right) {
        const leftIsXL = left.slice(-1) == "X", rightIsXL = right.slice(-1) == "X";
        // compare two XL sizes, e.g., 2X vs 3X
        if (leftIsXL && rightIsXL) return parseInt(left) - parseInt(right);
        // compare one XL size to any other size
        else if (left.slice(-1) == "X") return 1;
        else if (right.slice(-1) == "X") return -1;
        // compare two non-XL sizes
        else return stdSizes.indexOf(left) - stdSizes.indexOf(right);
    }

然后将其传递给.sort():

console.log(['3X','4X','2X','MD','SM','XL'].sort(compareSizes))

这个的输出是:

Array(6) [ "SM", "MD", "XL", "2X", "3X", "4X" ]

Array.prototype.sort() 记录在这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

【讨论】:

    【解决方案4】:

    这是使用订单作为模板的另一种方式,我们通过reduce() 填写并删除空位

    let order = "SM,MD,2X,3X,4X,5X,LG,XL".split(","); // our example order
    "3X,LG,XL,4X".split(',') // array-ify the input
      .reduce((b,a) => {b[order.indexOf(a)]=a; return b}, // fill the available slot in the accumulator
      [].fill('',0,order.length)) //... which was pre-populated with empty indexes from fill()
      .filter(e=>e) //filter out the empties
    

    它非常适合一行

    let sizes = "3X,LG,XL,4X".split(',').reduce((b,a) => {b[order.indexOf(a)]=a; return b},[].fill('',0,order.length)).filter(e=>e)
    

    它使用reduce按照示例order的顺序填充可用大小的数组,然后过滤掉空白

    let order = "SM,MD,2X,3X,4X,5X,LG,XL".split(",");
    const sortSizes = (s) => {
    return s.split(',').reduce((b,a) => {b[order.indexOf(a)]=a; return b},[].fill('',0,order.length)).filter(e=>e)
    }
    
    let input="3X,LG,XL,4X";
    //Output: LG,XL,3X,4X
    console.log(sortSizes(input));
    
    input = "LG,XL,2X,5X,2X"
    //Output: SM,MD,2X,2X,5X
    console.log(sortSizes(input));

    【讨论】:

      猜你喜欢
      • 2011-09-04
      • 1970-01-01
      • 2022-08-21
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      • 2019-11-24
      相关资源
      最近更新 更多