2015-12-18 2 views
-2

У меня есть массив строк, которые я хочу заказать, используя самую строку и предопределенный порядок, который у меня есть.Лучший способ упорядочить массив строк в определенном порядке в Javascript?

Так что массив может быть:

['text4', 'image2', 'text1', 'text3', 'image1'] 

И предопределенный порядок таков:

text1, image1, text2, image2, text3, image3, text4, image4, text5, image5

Так упорядоченный массив должен выглядеть следующим образом:

['text1', 'image1', 'image2', 'text3', 'text4'] 

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

То, как я могу думать, что это делается, - это цикл по массиву, посмотрите, есть ли «текст1», а если есть, поместите его в упорядоченный массив. И сделайте это для каждой строки в заданном порядке. Но есть ли лучший способ сделать это?

спасибо.

+0

Всегда ли это «текст» и «изображение», или могут быть другие строки? – Amit

ответ

2

Существует встроенный метод массива sort, который сортирует массив. По умолчанию он сортирует все записи как строки в алфавитном порядке. Однако вы можете передать функцию обратного вызова с вашими критериями сортировки.

Для вашего конкретного случая это можно было бы сделать что-то вроде этого:

['text4', 'image2', 'text1', 'text3', 'image1'].sort(function(a, b) { 
    return a.slice(-1) > b.slice(-1); 
}); 

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

Надеюсь, этот пример поможет вам.

EDIT:

Поскольку функция сортировки по умолчанию будут отсортированы в алфавитном порядке, image будет стоять перед text. Это означает, что после первоначальной сортировки вам необходимо будет указать reverse массив после первоначальной сортировки. Пример:

var ary = ['text4', 'image2', 'text1', 'text3', 'image1']; 
ary.sort(); 
ary.reverse(); 
// here comes the custom sorting 
0

Try:

var a = ['text4', 'image2', 'text1', 'text3', 'image1']; 
var store = []; 
for (var i = 0, len = a.length; i < len; i++) { 
    var sortnr = (100 - parseFloat(a[i]))) + a[i]; 
    store.push([sortnr, a[i]]); 
} 
store.sort(function (x, y) { 
    return x[0] < y[0] ? 0 : -1; 
}); 
for (var i = 0, len = store.length; i < len; i++) { 
    a[i] = store[i][1]; 
} 
store = null; 
0

Это не так трудно создать функцию сравнения и использовать обычную функцию сортировки:

var sorted = ['text4', 'image2', 'text1', 'text3', 'image1'].sort(function(a, b) { 
 
    var numPartA = +(a.match(/\d+$/)[0]); 
 
    var numPartB = +(b.match(/\d+$/)[0]); 
 
    if(numPartA !== numPartB) { 
 
     return numPartA - numPartB; 
 
    } 
 
    return a > b ? -1 : 1; 
 
    }); 
 

 
document.write(sorted);

В основном мы изолирования числовую часть и использовать ее для сортировки. При равном, мы по умолчанию сортируем строки, но с обратным порядком, так как «текст» предшествует «изображению» в алфавитном порядке

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