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] ||
         ...