按数字对值进行一次排序,对字符串进行第二次排序

时间:2018-07-26 09:17:37

标签: javascript regex datatables

我有这些值:

AH 18, AH 17, AH 16, AH 15, PE 18, PE 17, PE 16, PE 15... etc

我希望能够通过单击适当的按钮将其排序为以下顺序:

AH 18, PE 18, AH 17, PE 17, AH 16, PE 16, AH 15, PE 15

我该如何实现?我知道如何使用下面的代码来处理顺序,这可以正常工作,因为它通过使用正则表达式之前删除空格和所有内容来使用数字对值进行排序,但是这样做会使我得到PE 18, AH 18, PE 17, AH 17 ... etc而不是我想要的正确顺序是。

columnDefs.push({"type": "num-fmt", "targets": i});
columnDefs.push({
    "targets": i,
    "render": function ( data, type, row, meta ) {
            return type === 'sort' ? data.replace(/.*\s/g,'') : data;
    }
});

问我问题的另一种方法是:

有没有一种方法可以按数字一次排序,而第二次按字符串排序呢?第一次将它们按数字PE 18, AH 18, PE 17, AH 17 ... etc进行排序,第二次将它们按前2个字符串进行排序,因此我得到的最终结果为AH 18, PE 18, AH 17, PE 17 ... etc

5 个答案:

答案 0 :(得分:2)

您可以拆分字符串,然后将数字部分用于数字排序,然后再按字符排序。

const split = s => s.split(' ');

var array = ['AH 18', 'AH 17', 'AH 16', 'AH 15', 'PE 18', 'PE 17', 'PE 16', 'PE 15'];

array.sort((a, b) => {
    var aa = split(a),
        bb = split(b);
    return bb[1] - aa[1] || aa[0].localeCompare(bb[0]);
});

console.log(array);

答案 1 :(得分:1)

如果您需要使用相同长度的数字(输入数据显示只有2位数字),则可以使用

.replace(/([a-zA-Z]+)\s+(\d+)/g, '$2$1')

请参见regex demo

详细信息

  • ([a-zA-Z]+)-捕获第1组:一个或多个ASCII字母
  • \s+-超过1个空格
  • (\d+)-捕获第2组:一个或多个数字。

$2$1替换模式在删除组之间的空白时交换了组,因此最终比较了18AH17AH16AH15AH,等

答案 2 :(得分:1)

var data = "AH 18, AH 17, AH 16, AH 15, PE 18, PE 17, PE 16, PE 15";
var output = data.replace(/\s*/g,'').split(",").sort();
print(output);
print (bhavya(data,'sort','bhavya','meta'));

function bhavya( data, type, row, meta ) {
    return type === 'sort' ? data.replace(/\s*/g,'').split(",").sort() : data;
}

我测试了上面的代码,我认为这对您有用

答案 3 :(得分:1)

恕我直言,您也许可以这样做:

var data = 'AH 18, AH 17, AH 16, AH 15, PE 18, PE 17, PE 16, PE 15'.split(',').map(e => e.trim());
console.log("Original Data");
console.log(data);

var sortedByNumber = data.sort((a,b) => b.split(" ")[1] - a.split(" ")[1])
console.log("sortedByNumber");
console.log(sortedByNumber);

var sortedByString = data.sort((a,b) => (a.split(" ")[0]).localeCompare(b.split(' ')[0]))
console.log("sortedByString & sortedByNumber");
console.log(sortedByString);

答案 4 :(得分:0)

尝试以下操作:

var items = ['AH 18', 'AH 17', 'AH 16', 'AH 15', 'PE 18', 'PE 17', 'PE 16', 'PE 15'];
items.sort(function(a, b) {
    var a_split = a.split(/\s+/);
    var b_split = b.split(/\s+/);
    if (a_split[1]>b_split[1]) {
        return -1;
    } else if (a_split[1]==b_split[1]) {
        if (a_split[0]>b_split[0]) {
            return 1;
        } else {
            return -1;
        }
    } else {
        return 1;
    }
});
alert(items);