JSFiddle - React, Tailwind, and code Playground
HTML
<ul id="cards">
<li>From Stockholm, take flight SK22 to New York JFK. Gate 22, seat 7B. Baggage will we automatically transferred from your last leg.</li>
<li>Take train 78A from Madrid to Barcelona. Sit in seat 45B.</li>
<li>From Gerona Airport, take flight SK455 to Stockholm. Gate 45B, seat 3A. Baggage drop at ticket counter 344.</li>
<li>Take the airport bus from Barcelona to Gerona Airport. No seat assignment.</li>
</ul>
<ul id="sorted_cards"></ul>
JavaScript
/**
* Принимает несортированный список карточек путешественника,
* создает новый список карточек в упорядоченном порядке
* на месте прошлого списка или в новом списке, в зависимости от параметров
* и возвращает массив с упорядоченным списком карточек
* @param id1 идентификатор исходного несортированного списка
* @param id2 идентификатор нового списка для вставки упорядоченного списка (необязвательный параметр)
* @param deleteSource при значении true удаляет исходный список, при значении false - оставляет (по умолчанию false)
* @returns {Array} массив с упорядоченными карточками
*/
function travelerCardsSorter(id1, id2, deleteSource) {
var currentUL, currentLIs,
numberOfCards, i,
cards = [], points,
pointsFrom = [], pointsTo = [],
startAt, toSort, sortedCards = [],
newUL, newLI;
currentUL = document.getElementById(id1);
currentLIs = currentUL.children;
numberOfCards = currentLIs.length;
// Наполняем массивы
for (i = 0; i < numberOfCards; i += 1) {
cards.push(currentLIs[i].innerHTML);
// создаем массив точек отправлния и прибытия всех карточек
points = currentLIs[i].innerHTML.match(/[fF]rom\s*([A-Z]\w+).*?[tT]o\s*([A-Z]\w+)/);
pointsFrom.push(points[1]);
pointsTo.push(points[2]);
}
// Подготовка массивов для поиска отправной точки
// сортируем массивы в порядке следования символов
// в таблице ASCII для поиска точки отправления
pointsFrom.sort();
pointsTo.sort();
// Поиск отправной точки
for (i = 0; i < numberOfCards; i += 1) {
// проверяем совпадение пунктов
if (pointsFrom[i] !== pointsTo[i]) {
// если пункты не совпадают, значит наткнулись на точку from или to
// 3 случая: индексы from и to совпадают,
// from следует ранее, to следует ранее
// первые два отлавливаем в этом условии:
if (pointsFrom[i + 1] === pointsTo[i] ||
...