【问题标题】:Alphanumeric and numeric strings sorting not working as expected字母数字和数字字符串排序未按预期工作
【发布时间】:2023-02-03 23:18:09
【问题描述】:

我实现了以下逻辑以对混合数据(包含字母数字和数值)应用排序,但它没有按预期排序。

/*For numeric value sorting */
if (!isNaN(fVal) && !isNaN(lastVal)) {
    switch (policy) {
        case SORT_BY_DESC:
            return +fVal < +lastVal ? 1 : -1;
        case SORT_BY_ASC:
            return +fVal > +lastVal ? 1 : -1;
        default:
            return 0;
    }
} 
/* For alphanumeric sorting */
else {
    switch (policy) {
        case SORT_BY_DESC:
            return fVal < lastVal ? 1 : -1;
        case SORT_BY_ASC:
            return fVal > lastVal ? 1 : -1;
        default:
            return 0;
    }
}

如果所有值都是数字,则此逻辑工作正常,但如果我有混合数据,则无法正确排序。

原始数据 - ['60091A0222', '633', '63372A1019', '63372A1021', '6667', '6789', '7776']

预期结果 -

按降序排列的数据 - 63372A1021, 63372A1019, 60091A0222, 7776, 6789, 633

按升序排列的数据 - 633,, 6667, 6789, 7776, 60091A0222, 63372A1019, 63372A1021

我得到了什么 -

降序 - 7776, 6789, 6667, 63372A1021, 63372A1019, 633、 60091A0222

升序 - 60091A0222, 633、 63372A1019, 63372A1021, 6667, 6789, 7776

【问题讨论】:

  • 请以文字符号添加原始数据。

标签: javascript reactjs sorting


【解决方案1】:

您可以检查有限性并将该值排序到顶部。

const
    data = ['60091A0222', 633, '63372A1019', '63372A1021', 6667, 6789, 7776],
    asc = (a, b) => isFinite(b) - isFinite(a) || (a > b) - (a < b),
    desc = (a, b) => isFinite(a) - isFinite(b) || (a < b) - (a > b)

data.sort(asc);
console.log(...data);

data.sort(desc);
console.log(...data);

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多