Сортировка массива по значением

У меня есть вот такой массив

  const usersTable = [
    {
      id: 516;
      info: [
        {
        data: "Viktor";
        type: "name";
      },
      {
        data: "Pavlov";
        type: "surname";
      }
    ];
    },
   {
      id: 254;
      info: [
        {
        data: "Alexey";
        type: "name";
      },
      {
        data: "Romanov";
        type: "surname";
      }
    ];
    },
  ]

И мне нужно сортировать этот массив по type, то есть мне нужно проверять сортировка по name или surname

Я попытался как то вот так это решить, но у меня не получилось.

  const sortArray = usersTable.sort((a, b) => {
     const findIndex = (arr) =>
          arr.info.findIndex((item) => item.type === "surname");
     const x = a.info[findIndex(a)];
     const y = b.info[findIndex(b)];
     return x.data > y.data ? 1 : -1;
  });
  console.log(sortArray);

Буду рад хоть какому то ответу


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

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

Я тут как то разобрался, но что то не понял почему мой прошлый метод не работал.

Раз работает, то я не буду трогать :)

Часть кода подстмотрел здесь и кто то уже задавал схожий запрос

    // От sortTable: {
    // sortType: "asc" | "desc" | "", 
    // sortBy: "name" | "surname"
    // }

     const compare = (a, b) => {
        const x = a.info[a.info.findIndex((i) => i.type === sortTable.sortBy)].data;
        const y = b.info[b.info.findIndex((i) => i.type === sortTable.sortBy)].data;
     
        if (sortTable.sortType === "asc") {
    // У меня тут ещё сортировка по названию. Тут отображается от А до Я
          return x > y ? 1 : -1;
        } else if (sortTable.sortType === "desc") {
     // Тут отображается от Я до А
          return x < y ? 1 : -1;
        } else {
     //  Тут всё по дефолту
          return 0;
        }
      }
→ Ссылка
Автор решения: Evgenii

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

    const compare = (a, b) => {
    const x = a.info[a.info.findIndex((i) => i.type === sortTable.sortBy)].data;
    const y = b.info[b.info.findIndex((i) => i.type === sortTable.sortBy)].data;
 
    if (x > y) {
       return 1;
    }

    if (x < y) {
      return -1;
    }

      return 0;
 }
  
→ Ссылка
Автор решения: EzioMercer

Это вариант, если разрешено хранить пользователей в другом формате:

const usersTable = [{
    id: 516,
    info: {
      name: 'Viktor',
      surname: 'Pavlov'
    }
  },
  {
    id: 254,
    info: {
      name: 'Alexey',
      surname: 'Romanov'
    }
  }
]

const sortUsersByParam = (sortParam) => {
  return usersTable.sort((a, b) => {
    const first = a.info[sortParam];
    const second = b.info[sortParam];

    if (first > second) return 1;
    if (first < second) return -1;
    if (first === second) return 0;
  })
}

console.log('Sorting by name\n', sortUsersByParam('name'));
console.log('Sorting by surname\n', sortUsersByParam('surname'));

→ Ссылка