Сортировка многомерного массива Javascript по числовому порядку

У меня есть двумерный массив, который мне нужно отсортировать численно. Вот пример массива:

   [0]    [1]
    3     320
    55B   250
    26    100
    55A   260
    56    310
    89    420

Мне нужно упорядочить численно по значениям [0]. Значения хранятся в виде строк. Я понял, как сортировать массивы в алфавитном и числовом порядке, но я не могу понять, как упорядочить этот массив из-за случайных A и B.


person sebastien leblanc    schedule 09.11.2011    source источник
comment
Я правильно понимаю, массив такой: [[3, 320], [55B, 250], 26, 100] ], а не [[3, 55B, 26], [320, 250, 100] ] ?   -  person Yogu    schedule 09.11.2011
comment
Не могли бы вы более конкретно описать, как вы хотите отсортировать значения? Сейчас все это кажется немного произвольным. Каковы ограничения? Другими словами, будут ли буквы ВСЕГДА стоять на третьей позиции слева? Вроде того.   -  person Doug Stephen    schedule 09.11.2011
comment
возможный дубликат Сортировка двумерного массива по второму значению   -  person epascarello    schedule 09.11.2011
comment
Насколько я понимаю, он умеет сортировать, но не умеет сортировать числа с буквами "А" и "В" на конце...   -  person Adam Jurczyk    schedule 09.11.2011
comment
@AdamJurczyk, в общем-то...   -  person sebastien leblanc    schedule 09.11.2011


Ответы (2)


Метод parseInt будет игнорировать любые строковые символы после числа, удаляя буквы A и B.

arr.sort(function(rowA, rowB){
    var a = parseInt(rowA[0], 10);
    var b = parseInt(rowB[0], 10);

    if (a > b)
        return 1;
    else if (a < b)
        return -1;
    return 0;
});
person Zack Bloom    schedule 09.11.2011

Просто для заметки - если эти A и B не имеют ничего общего с сортировкой, используйте parseInt, как написал Зак.

Но если его следует использовать в сортировке, вы можете сделать что-то вроде этого:

arr.sort(function(l,r){
  var vl = l[0].split(/(\d+)(\D*)/),
      vr = r[0].split(/(\d+)(\D*)/);

  vl[1] = parseInt(vl[1]);
  vr[1] = parseInt(vr[1]);

  if(vl[1] < vr[1]){
    return -1;
  }else if(vl[1] === vr[1]){
      if(vl[2] < vr[2]) return -1;
      else if(vl[2] === vr[2]) return 0;
      else return 1;
  }else{
      return 1;
  }
}); 
person Adam Jurczyk    schedule 09.11.2011