2012-06-06 2 views

ответ

4

Вам необходимо написать метод сортировки (вы можете написать любой, который вам нравится), который разбивает строку на _ и использует вторую часть как числовое значение сортировки.

​ function sortOnNum(a,b){ 
     //you'll probably want to add a test to make sure the values have a "_" in them and that the second part IS a number, and strip leading zeros, if these are possible 
     return (a.split("_")[1] * 1 > b.split("_")[1] * 1)? 1:-1;// I assume the == case is irrelevant, if not, modify the method to return 0 for == 
    } 

    var ar = new Array ("foo_1", "foo_19", "foo_3", "foo_1002"); 

ar.sort(sortOnNum); //here you pass in your sorting function and it will use the values in the array against the arguments a and b in the function above 

alert(ar); // this alerts "foo_1,foo_3,foo_19,foo_1002" 

Вот скрипка: http://jsfiddle.net/eUvbx/1/

+0

спасибо, док! :) – user1054134

+1

Хотя булевы находят определенный успех в методах сортировки, [правильный ответ] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort#Description) является положительным или отрицательным числом или 0. Я использовал также булевы, пока я не вызвал на него;) – Sampson

+0

хорошая точка, я отредактирую –

2

Далее предполагается, ваш номер будет всегда быть в самом конце строки. Обратите внимание, я добавил несколько дополнительных примеров в массив, чтобы продемонстрировать различные форматы, это может работать:

var numbers = ["word_12", "word_59", "word_17", "word23", "28", "I am 29"]; 

numbers.sort(function(a,b){ 
    return a.match(/\d+$/) - b.match(/\d+$/); 
}); 

что приводит:

["word_12", "word_17", "word23", "28", "I am 29", "word_59"] 
+0

Нет необходимости в '+', '-' уже присваивает номер. – georg

+0

@ Джонатан, разве это не страдает от риска появления в его «слове» части? –

+0

@ Dr.Dredel Это требует, чтобы его значения отображались в том же формате, который он здесь представил. Если они этого не сделают, могут возникнуть проблемы. При этом я сделал модификацию, которая будет соответствовать номерам в * конце * значения. – Sampson

0

только в случае, если есть числа и подчеркивания слово (которое вполне допустимые символы слова по яваскрипту определения слова:

arr.sort(function(_1, _2) 
{ 
    return +_1.substr(_1.lastIndexOf("_")+1)-_2.substr(_2.lastIndexOf("_")+1); 
}); 
0

Вот код для общего случая:

natcmp = function(a, b) { 
    var aa = [], bb = []; 

    (a + "").replace(/(\d+)|(\D+)/g, function($0, $1, $2) { aa.push($2 || Number($1)) }); 
    (b + "").replace(/(\d+)|(\D+)/g, function($0, $1, $2) { bb.push($2 || Number($1)) }) 

    var la = aa.length, lb = bb.length; 

    for (var i = 0; i < Math.max(la, lb); i++) { 
     if (i >= lb) return 1; 
     if (i >= la) return -1; 
     if (aa[i] > bb[i]) return 1; 
     if (aa[i] < bb[i]) return -1; 
    } 

    return 0; 
} 

Пример:

var x = ["word_12", "word_59", "ford_1a", "ford_12a", "ford_2a", "word_0", "word_"]; 
x.sort(natcmp) 

# ["ford_1a", "ford_2a", "ford_12a", "word_", "word_0", "word_12", "word_59"] 

Это называется "естественный сортировки".

Смежные вопросы