Упорядочение массива строк в соответствии с указанным c расположением строк - PullRequest
3 голосов
/ 14 января 2020

В Javascript у меня есть массив значений, таких как:

["Toy","Car","PC","Water","Apple"]

Мне нужно упорядочить значения в определенном порядке c в этом приоритете:

PC, Car, Toy, Apple, Water

Заметьте, это не может быть отсортировано по алфавиту c, но в заданном c порядке значений.

Как мне лучше всего это сделать sh? После того, как он будет заказан, я буду повторять его в течение 1 oop, и мне нужно остаться в этом порядке. Кроме того, лучше всего хранить его в массиве.

Кроме того, если мы можем добавить любые значения, не указанные в «списке приоритетов», которые будут добавлены в конце результирующего массива в алфавитном порядке, это будет быть идеальным.

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

Пример 2

Входящий массив: ["Зеленый", "Синий", "Желтый", "Красный"]

Предоставляется предпочтительный порядок значений: Желтый, Черный, Серебряный, Синий, Красный, Зеленый , Серый

Ожидаемый результат: ["Желтый", "Синий", "Красный", "Зеленый"]

Пример 3

В этом В этом случае входящие имеют больше значений, чем список заказов.

Входящий массив: ["Зеленый", "Синий", "Желтый", "Красный", "Серебристый", "Черный]

При условии предпочтительного порядка значений: Желтый, Черный, Серебро

Ожидаемый результат: ["Желтый", "Черный", "Серебро", "Зеленый", "Синий", "Красный"]

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

Ответы [ 2 ]

4 голосов
/ 14 января 2020

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

var data = ["Toy", "Car", "PC", "Water", "Apple", "Sky", "Banana", "Day", "Green"],
    order = { PC: 1, Car: 2, Toy: 3, Apple: 4, Water: 5, default: Number.MAX_VALUE };

data.sort((a, b) =>
    (order[a] || order.default) - (order[b] || order.default) ||
    a > b || -(a < b)
);

console.log(...data);
1 голос
/ 14 января 2020

Вы можете создать карту приоритетов и использовать простую .sort()

const priorityOrder = {
  PC: 0,
  Car: 1,
  Toy: 2,
  Apple: 3,
  Water: 4,
  Banana: 5,
  Bicycle: 6
};

const input = ["Apple", "Car", "Earth", "Water", "Toy", "PC", "Plane", "Alpha Centauri"];

const prioritized = [];
const extra = [];

// to be more efficient I will use a forEach, not .filter() x2
input.forEach((value) => {
  if (priorityOrder[value] !== undefined)
    prioritized.push(value);
  else
    extra.push(value);
});

prioritized.sort((a, b) => priorityOrder[a] - priorityOrder[b]);
extra.sort();

const output = [].concat(prioritized, extra);
console.log(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...