Qairat
@Qairat
frontend developer, angular 2+

Как сортировать по индексу другого массива в js?

Добрый день!
Такая задача, не могу правильно сортировать по ID в таком порядке 5,1,9,6,4.
Ко мне приходит данные таким образом
data = [
{ID: 1, country: 'England'},
{ID: 4, country: 'USA'},
{ID: 9, country: 'Russia'},
{ID: 5, country: 'Germany'},
{ID: 6, country: 'France'},
];
Мне надо сделать сортировку так:
data = [
{ID: 5, country: 'Germany'},
{ID: 1, country: 'England'},
{ID: 9, country: 'Russia'},
{ID: 4, country: 'USA'},
{ID: 6, country: 'France'},
];
Спасибо!
  • Вопрос задан
  • 3384 просмотра
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Сортировать по indexOf( ID ) в массиве, задающем порядок сортировки:
var data = [
  {ID: 1, country: 'England'},
  {ID: 4, country: 'USA'},
  {ID: 9, country: 'Russia'},
  {ID: 5, country: 'Germany'},
  {ID: 6, country: 'France'},
];

const order = [5,1,9,6,4];

data.sort((a,b) => order.indexOf(a.ID) - order.indexOf(b.ID));

/* [
  {"ID":5,"country":"Germany"},
  {"ID":1,"country":"England"},
  {"ID":9,"country":"Russia"},
  {"ID":6,"country":"France"},
  {"ID":4,"country":"USA"}]
*/


На больших массивах для ускорения:
  1. добавить в исходный массив новое поле с порядковым номером, который каждый элемент должен занять после сортировки;
  2. отсортировать по этому полю.

Так будет быстрее, чем на каждой операции сравнения двух элементов искать их индексы во втором массиве.
data = data.map( e => {e.sortBy = order.indexOf(e.ID); return e;} );
data.sort( (a,b) => a.sortBy - b.sortBy);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
pm_wanderer
@pm_wanderer
junior-HTML
Думаю вот так будет правильней и быстрей:
function sortData(data, sortingOrder) {
  var result = [];

  for (var i = 0; i < data.length; i++) {
    result[sortingOrder.indexOf(data[i].ID)] = data[i];
  }
  
  return result;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
21 нояб. 2024, в 19:31
500 руб./за проект
21 нояб. 2024, в 19:28
200000 руб./за проект