【问题标题】:javascript array sort strings and numbersjavascript数组排序字符串和数字
【发布时间】:2021-08-08 12:22:36
【问题描述】:

我想用字符串和数字对数组进行排序。

var toSort = ['100', 'Calc', '30', '43', '52', '16', '10', '11', '12', 'Calc', '2', 'N/A', '8'];

预期的行为是当对字符串进行排序时,将在两种状态(asc 和 desc)的列表末尾排序,例如: 升序:

['2','8','10','11','12','16','30','43','52','100','Calc','Calc','N/A']

描述:

['100','52','43','30','16','12','11','10','8','2','Calc','Calc','N/A']

我有它用于 asc 状态:

toSort.sort(function (a,b) {
  if (a === 'Calc') return 1;
  else if (a === 'N/A') return 1;
  else return a.localeCompare(b, undefined, { numeric: true});
});

console.log(toSort);

关于 desc 状态的任何想法? tnx

【问题讨论】:

标签: javascript arrays sorting


【解决方案1】:

您可以检查值是否为isFinite

const
    array = ['100', 'Calc', '30', '43', '52', 'Calc', '16', '10', 'N/A', '123', '11', '12', 'Calc', '2', 'N/A', '8'];

array.sort((a, b) => isFinite(b) - isFinite(a) || a - b || a.localeCompare(b));
console.log(...array);

array.sort((a, b) => isFinite(b) - isFinite(a) || b - a || a.localeCompare(b));
console.log(...array);

【讨论】:

    【解决方案2】:

    您可以创建一个具有 2 个属性 numbersstringsreduce 的对象,之后您可以将该对象传递给您可以进行相应排序并返回结果。

    finalResult = result after sorting numbers + result after sorting strings.
    

    var toSort = [
      "100",
      "Calc",
      "30",
      "43",
      "52",
      "16",
      "10",
      "11",
      "12",
      "Calc",
      "2",
      "N/A",
      "8",
    ];
    
    function sort({ strings, numbers }, type) {
      if (type === "asc") {
        return [
          ...numbers.sort((a, b) => a - b),
          ...strings.sort((a, b) => (a > b ? 1 : -1)),
        ];
      } else {
        return [
          ...numbers.sort((a, b) => b - a),
          ...strings.sort((a, b) => (a > b ? -1 : 1)),
        ];
      }
    }
    
    const obj = toSort.reduce(
      (acc, curr) => {
        if (/\d+/g.test(curr)) acc.numbers.push(curr);
        else acc.strings.push(curr);
        return acc;
      }, {
        strings: [],
        numbers: []
      }
    );
    
    console.log(sort(obj, "asc"));
    console.log(sort(obj, "dsc"));

    【讨论】:

    • 嗯,ifs 中不需要两个不同的分支。只需定义一个装饰器:const reverse = compareFn => (a, b) => compareFn(b, a)。所以现在,descComparator = reverse(ascComparator)。这允许直接消除重复代码:jsbin.com/vizunex/1/edit?js,console
    • 顺便说一句,a - b(或b - a)实际上并没有对字符串进行排序,因为结果是NaN,所以没有明确定义的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2020-05-29
    • 2014-07-11
    相关资源
    最近更新 更多