Как отсортировать массив объектов со связанными массивами?

Есть массив объектов такого типа:

const source = [
  {
    id: 1,
    price: ["100 р", "300 р", "200 р"],
    tariff: ["first", "third", "second"],
  },
  {
    id: 2,
    price: ["200 р", "100 р", "300 р"],
    tariff: ["Dsa", "Qwe", "Cxz"],
  },
  // и т.д.
];

На выходе необходимо получить массив "source", но отсортированный по price или tariff.

Сложность в том, что price[0] условно связан с tariff[0], так же как и tariff[1] с price[1].

Так же, длины массивов tariff и price всегда одинаковые, т.е. у обоих length может быть как 3, так и 2 и 1.

В результате, если мы сортируем по tariff то получаем отсортированный source:

[
  {
    id: 2,
    price: ["300 р", "200 р", "100 р"],
    tariff: ["Cxz", "Dsa", "Qwe"],
  },
  {
    id: 1,
    price: ["100 р", "200 р", "300 р"],
    tariff: ["first", "second", "third"],
  },
  // и т.д.
]

То есть мы сортируем и сам source и связанные вместе tariff и price.


Ответы (1 шт):

Автор решения: Meth0d

const source = [
    {
        id: 1,
        price: ["100 р", "300 р", "200 р"],
        tariff: ["first", "third", "second"],
    },
    {
        id: 2,
        price: ["200 р", "100 р", "300 р"],
        tariff: ["Dsa", "Qwe", "Cxz"],
    },
    {
        id: 3,
        price: ["500 р", "700 р", "1000 р"],
        tariff: ["elc", "dde", "intel"],
    },
]

function sortIt(arr, type) {
    return structuredClone(arr)
        .sort((a, b) => {
            a = a[type][0]
            b = b[type][0]

            if (a > b) return 1
            else if (a < b) return -1
            else return 0
        })
        .map(el => {
            el[type] = el[type].sort()

            return el
        })
}

console.log(sortIt(source, 'tariff'))
console.log(sortIt(source, 'price'))

→ Ссылка