2016-07-29 2 views
-1

Скажем, у меня есть массив со всеми 26 буквами алфавита в случайном порядке. Я знаю, как сортировать по алфавиту с помощью функции Array.sort(). Но как мне сортировать, если я хочу, чтобы конкретный алфавит говорил «М», чтобы быть первым в списке, а затем сортировать по алфавиту для остальных алфавитов.Сортировка массива Javascript с определенными критериями

В настоящее время я делаю сращивание «M» из массива, а затем после сортировки я переустанавливаю его обратно в список. Этот способ делать нормально или есть более чистый способ сделать это?

Пример:

Unsorted: ['b','c','d','m','a']

Сортировано: ['m','a','b','c','d']

+1

Добавьте пример того, как будет выглядеть несортированная строка и отсортированная строка. –

+1

Ваш текущий подход кажется мне лучше, чем на самом деле реализовать собственный алгоритм сортировки. – str

+0

Собирался добавить то, что сказал @str. –

ответ

2

Является ли это способ сделать нормально или есть более экологически чистых способов сделать это?

Это нормально, но если вы хотите, вы можете настроить вид: Array#sort принимает функцию, которую можно использовать, чтобы определить, в каком порядке две записи должны быть в Называется неоднократно sort в процессе сортировки..

Смотрите комментарии:

// Create the array 
 
var theArray = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""); 
 

 
// Sort it 
 
theArray.sort(function(left, right) { 
 
    // `left` and `right` are the two entries to compare. 
 
    // We return a negative number if `left` should come before `right`, 
 
    // 0 if they're equivalent for sorting purposes, or a positive number 
 
    // if `right` should come before `left`. 
 
    // So for M to be in front of all other letters, make sure you handle 
 
    // that in the return value: 
 
    if (left === "M") { 
 
     // Is the right also "M"? 
 
     if (right === "M") { 
 
      // Yes, equivalent for sorting 
 
      return 0; 
 
     } 
 
     // No, left should come first 
 
     return -1; 
 
    } 
 
    if (right === "M") { 
 
     // Right should come first (we know `left` isn't "M") 
 
     return 1; 
 
    } 
 
    // Default comparison 
 
    return left.localeCompare(right); 
 
}); 
 

 
// Show result 
 
console.log(theArray);

1

Вы можете использовать объект заказа для установки приоритета.

var array = ['z', 'r', 's', 'm', 'b', 'q', 'w', 'c', 'd', 'g', 'p', 'o', 't', 'k', 'n', 'i', 'j', 'a', 'y', 'x']; 
 
array.sort(function (a, b) { 
 
    var ORDER = { m: 1, M: 1 }; 
 
    return !ORDER[a] - !ORDER[b] || a.localeCompare(b); 
 

 
}); 
 
    
 
console.log(array);

+0

Что делать, если вы хотите указать больше вещей в порядке: '{m: 1, M: 1, x: 2, w: 3}' – nnnnnn

+0

вы можете взять что-то вроде '(ORDER [a.status] || 0) - (ORDER [b.status] || 0); 'с правильным значением нулевого значения по умолчанию, в зависимости от приоритета wanrted. –

+0

OK; хорошая идея ... – nnnnnn

-1

Помимо применения пользовательского компаратора функции сортировки, можно просто переместить символ позже.

var a = ['b','c','d','m','a']; 
 
var b = a.sort(); 
 
var c = ["m",...b.join``.replace("m","")]; 
 
console.log(c);

b.join`` преобразует массив в строку, .replace("m","") удаляет m, ... преобразует строку обратно в массив (это spread operator) и Сцепляет "m" с ним.

+0

Почему downvote? Что я неправильно понял? Мой ответ, похоже, дает правильный результат, нет? – nicael

+0

dv не от меня, но это не сортировка, но сборка. –

+0

Это просто короче и понятнее. Это более «чистый» способ. – nicael

0

Вот решение, которое хорошо масштабируется, если вам нужно больше случаев, а не только одна буква:

var alfabetPriority = "mabcdefghijklnopqrstuvwxyz"; 
 
var letters = ['b','c','d','m','a']; 
 

 
letters.sort(function(left, right) { 
 
    return alfabetPriority.indexOf(left) - alfabetPriority.indexOf(right); 
 
}); 
 

 
console.info(letters.join(',')); // gives: m,a,b,c,d

Что происходит здесь, что разбирали символы на основе их индекс в список приоритетов. Это будет работать с любым символом UTF-8. Вы можете изменить приоритет любым способом, в том числе для нескольких букв.

Тот же принцип применим, если вы должны сортировать слова, и в этом случае у вас будет массив слов, обозначающий приоритет, а не строку символов.

Недостатком этого может быть производительность, но если вы не собираетесь делать это тысячи раз с огромным списком символов, которые нужно сортировать, вы не заметите разницы.

+1

* «Все ответы пока не хорошо масштабируются ...» * Вышеуказанные масштабы хуже, чем любой другой ответ здесь, путем повторного повторного поиска строки с помощью 'indexOf'. Что касается «М», жестко закодированного: это было предусмотрено ОП. –

+0

Масштаб как решение, а не производительность @ T.J.Crowder. Для каждой буквы, которая нуждается в другом приоритете, код не должен изменяться с конструкцией 'if-else'. –

+0

Хорошо. ОП задал вопрос о том, чтобы сделать * одну вещь особенной, поэтому разумно (а не удаленно «не полезно») для ответов на нее. –