【问题标题】:Sorting first by text then by number on alpha numeric strings首先按文本排序,然后按字母数字字符串上的数字排序
【发布时间】:2021-11-28 04:15:14
【问题描述】:

我有一个这样的数组

["1","0K","11",1,"KE","PQ",5,"5"]

我希望它首先按文本排序,然后按如下数字排序

["KE","PQ","0K","1",1,5,"5","11"]

我使用了local compare,但它似乎不起作用。

function desc(a,b){
  //below is the code that needs improvement
  return b.toString().localeCompare(a, undefined, {
    numeric: true,
    sensitivity: "base",
  });
}

function sort(order) {
  return order === "desc"
    ? (a, b) => desc(a, b)
    : (a, b) => -desc(a, b);
}

function stableSort(array, cmp){
  const stabilizedThis = array.map((el, index) => [el, index]);
  stabilizedThis.sort((a, b) => {
    const order = cmp(a[0], b[0]);
    if (order !== 0) return order;
    return (a[1]) - (b[1]);
  });
  return stabilizedThis.map((el) => el[0]);
}

var arr = ["1","0K","11",1,"KE","PQ",5,"5"];
console.log(stableSort(arr, sort("asc")))

【问题讨论】:

  • 为什么是"KE","PQ","0K"?字符串比较将给出"0K","KE","PQ" 或相反的结果。
  • 你的OK是Kay的零。 0K。将所有内容转换为字符串并使用 array.sort().reverse()
  • i want it to sort first by text 带有零的文本"KE","PQ","0K" 永远不会按该顺序排序。它将是"0K","KE","PQ" 或相反的顺序。
  • 你想如何比较字母的?因为使用localeCompareKE 之前设置PQ

标签: javascript arrays sorting alphanumeric


【解决方案1】:

您可以编写filter 方法来获取strings containing numbers,删除条目,分别从rest 获取numbersstrings,然后按照您喜欢的方式对它们进行排序。

const data = ["1","0K","11",1,"KE","PQ",5,"5"];

const stringsWithNumbers = data.filter(x => /\d+[a-zA-Z]/.test(x));

const rest = data.filter(x => !stringsWithNumbers.includes(x));

const numbers = rest.filter((x) => parseInt(x, 10));
const words = rest.filter((x) => !parseInt(x, 10));

const result = [
  ...words.sort((a, b) => a.localeCompare(b)), 
  ...stringsWithNumbers.concat(numbers).sort((a, b) => parseInt(a) - parseInt(b)),
];

console.log(result);

【讨论】:

  • 输出错误。所需输出["KE","PQ","0K","1",1,5,"5","11"]
  • @Nitheesh 更新
  • 要求的输出是["KE","PQ","0K","1",1,5,"5","11"]
  • @NidhiDadiya 很高兴我能帮上忙!
  • 只是一个更新,在结果中,将字符串与数字和数字连接起来并对其应用排序。 ...stringsWithNumbers.concat(numbers).sort((a, b) => parseInt(a) - parseInt(b))
【解决方案2】:
    var arr = ["1","OK","11",1,"KE","PQ",5,"5"]
    var wordArr = []
    var numArr = []
    arr.forEach((el) => {
        if(Number(el)){
            numArr.push(el)
        } else {
            wordArr.push(el)
        }
    });
    wordArr.sort()
    numArr.sort((a, b) => a - b)
    arr = wordArr.concat(numArr)
    console.log(arr)

【讨论】:

    【解决方案3】:

    const sort = (arr = []) => {
      const nonAlpha = /[^a-zA-Z]/g, nonNum = /[^0-9]/g;
      return arr.sort((a, b) => {
        const aStr = String(a), bStr = String(b);
        const aAlpha = aStr.replace(nonAlpha, ""), bAlpha = bStr.replace(nonAlpha, "");
        const alphaCompare = bAlpha.localeCompare(aAlpha);
        if(alphaCompare) return alphaCompare;
        const aNum = +aStr.replace(nonNum, ""), bNum = +bStr.replace(nonNum, "");
        return aNum - bNum;
      });
    }
    
    console.log( sort(["1","0K","11",1,"KE","PQ",5,"5"]) );

    【讨论】:

    • 输出不正确
    猜你喜欢
    • 2013-06-29
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2022-01-01
    • 2014-01-10
    • 1970-01-01
    • 2020-09-03
    • 2021-12-28
    相关资源
    最近更新 更多