如何在字符串数组中使用自然排序?

时间:2016-01-19 18:40:52

标签: javascript sorting

我有以下数组和排序结果:

['53-15-9', '53-15-10', '53-15-8'].sort() // => ["53-15-10", "53-15-8", "53-15-9"]

但我需要得到以下结果:

["53-15-8", "53-15-9", "53-15-10"];

我怎样才能得到理想的结果?

6 个答案:

答案 0 :(得分:4)

要比较数字而不是字符串,请先删除'-'。当你使用算术 操作,JavaScript首先将其转换为数字。

'53-15-9'.replace(/-/g,'')给出'53159'。您可以使用sort()中的闭包来传递比较函数,该函数可以简单地从b中减去a。以下函数将对数组进行升序排序:

    ['53-15-9', '53-15-10', '53-15-8'].sort(function(a,b){
        return a.replace(/-/g,'') - b.replace(/-/g,'')
    })

更新

正如评论中所述,'54-1-1'小于'53-15-9'。我们可以将'54-1-1'更改为'54-01-01'。这仅适用于两位数。我们可以这样做:

function customSort(myArray) {
    myArray = myArray.map(function(a,b){
        var ar = a.split('-');

        return ar.map(function(arK, arV){return (arK<10)?'0'+arK : arK.toString();}).join('-');;
    })

    return myArray.sort(function(a,b){
        return a.replace(/-/g,'') - b.replace(/-/g,'')
    });  
}

customSort(['54-1-2','53-15-9', '53-15-10', '53-15-8']);
// => ["53-15-08", "53-15-09", "53-15-10", "54-01-02"]

答案 1 :(得分:0)

您可以使用自定义功能对零件进行拆分和分类。

var array = ['53-15-9', '53-15-10', '53-15-8'];
array.sort(function (a, b) {
    var aa = a.split('-'),
        bb = b.split('-'),
        i, r = 0, l = Math.max(aa.length, bb.length);
    for (i = 0; !r && i < l; i++) {
        r = (aa[i] || 0) - (bb[i] || 0);
    }
    return r;
});

document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');

答案 2 :(得分:0)

您需要定义自己的自定义排序功能。这是一个例子:

['53-15-9', '53-15-10', '53-15-8','2', '53-14-4','53-15-99'].sort(function(a,b){ // a and b are elements of the array
  // split by - and convert values to number 
  a = a.split('-').map(function(val){return Number(val)}) 
  b = b.split('-').map(function(val){return Number(val)})

  // if one has less elements than another, we consider it should go first
  if(a.length != b.length) return a.length > b.length

  //else, one goes after another if one of its elements is greater than the others at that index
  return a.some(function(val, index){
      return val > b[index]
  }) == 0 ? -1 : 1   

})

//output: ["2", "53-14-4", "53-15-8", "53-15-9", "53-15-10", "53-15-99"]

答案 3 :(得分:0)

['53-15-9', '53-15-10', '53-15-8'].sort(function(a, b) {
  var aNum = parseInt(a.replace(/-/g, ''));
  var bNum = parseInt(b.replace(/-/g, ''));
  return aNum < bNum ? -1 : aNum > bNum ? 1 : 0;
});

假设您想按数字顺序对它们进行排序,包括所有部分,只需删除-,将它们解析为int,然后在自定义排序函数中对int进行排序。

答案 4 :(得分:0)

var arr = ['53-15-9', '53-15-10', '53-15-8'];
arr.sort(function(a,b){ return a.replace(/-/g,'') - b.replace(/-/g,'') });  
console.log(arr);

输出

["53-15-8", "53-15-9", "53-15-10"]

答案 5 :(得分:0)

尝试使用-

比较Array.prototype.every()分隔的每个数字

var arr = ["53-15-8", "53-15-9", "53-15-10"];

arr.sort(function(a, b) {
  var curr = a.split(/-/).map(Number);
  var next = b.split(/-/).map(Number);
  return curr.every(function(val, key) {return val <= next[key]}) ? a : b
});

console.log(JSON.stringify(arr))