【问题标题】:javascript: sort an array a certain way with integers and charactersjavascript:使用整数和字符以某种方式对数组进行排序
【发布时间】:2012-03-09 04:22:14
【问题描述】:

我正在尝试以特定方式对数组进行排序,并且我正在尝试有效地进行排序,最好使用 .sort() 函数。这是我需要使用的数组类型的示例:

["10", "11", "12", "13", "2", "3", "4", "5", "6", "7", "8", "9", "2a", "2s", "3a"]

这是我在排序后寻找的:

["13", "12", "11", "10", "9", "8", "7", "6", "5", "4", "3", "3a", "2s", "2", "2a"]

规则:

按降序排列整数值。附加了“a”的整数具有较小的值。带有“s”的整数具有更大的值。因此,2a 将介于 2 和 1 之间,而 2s 将介于 3 和 2 之间。3a 将大于 2s。

请帮忙!

【问题讨论】:

  • 您可以提供一个compareFunction to sort,使用您喜欢的任何逻辑对成员进行排序。
  • 你意识到数组会导致非法令牌错误吗?你的意思是让它们都是字符串吗?
  • 是的,它们都是字符串。我的错。

标签: javascript


【解决方案1】:

这是使用 javascript .sort() 函数的方法。由于您想允许“2a”和“2s”,我假设所有输入都是字符串。

这里的工作演示:http://jsfiddle.net/jfriend00/NDbcC/

var input = ["10", "11", "12", "13", "2", "3", "4", "5", "6", "7", "8", "9", "2a", "2s", "3a"];

var suffix = {"s": 1, "a": -1, 
      "0": 0, "1": 0, "2": 0, "3": 0, "4": 0, "5": 0, 
      "6": 0, "7": 0, "8": 0, "9": 0};

input.sort(function(a, b) {
    var numA = parseInt(a, 10), numB = parseInt(b, 10);
    if (numA == numB) {
        numB = suffix[b.charAt(b.length - 1)];
        numA = suffix[a.charAt(a.length - 1)];
    }
    return(numB - numA);
});

//output is: 
// ["13", "12", "11", "10", "9", "8", "7", "6", "5", "4", "3", "3a", "2s", "2", "2a"]

【讨论】:

  • 这就是我要找的。比我的答案短。谢谢!
【解决方案2】:

基本上,您需要将数字解析出来并进行比较,如果后面的字符是“a”则加 1,如果后面的字符是“s”则减 1(因为它是逆序排序)。

这是我想出的,它适用于所有字符串的数组或混合字符串和数字的数组:

var weirdSort = (function () {
    var chr = String.prototype.charAt,
        add = {a:1, s:-1};

    return function (a, b) {
        var intA = parseInt(a), intB = parseInt(b);

        if (intA === intB) {
            if (isNaN(a))
                intB = intA + add[chr.call(a, 1)];

            if (isNaN(b))
                intA = intB + add[chr.call(b, 1)];
        }

        return intB - intA;
    }
})();

[10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9, "2a", "2s", "3a"].sort(weirdSort);
//-> [13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, "3a", "2s", 2, "2a"]

可能有更简单的方法,但我认为我的大脑在凌晨 1 点没有满负荷工作是可以原谅的。

【讨论】:

  • 原谅了。简直太棒了。
猜你喜欢
  • 2013-08-04
  • 1970-01-01
  • 2011-11-12
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2020-11-30
相关资源
最近更新 更多