Структура данных или процесс сортировки массива на основе порядка сортировки другого - PullRequest
0 голосов
/ 18 октября 2018

У меня есть два массива, которые я загружаю в параметр "серия" Highcharts, например:

A = [25, 100, 50, 12]
B = [50, 12, 100, 25]

Порядок A и B соответствуют Y значению на графике, поэтому, если бы я отсортировал A в порядке возрастания, порядок B должен был бы соответствовать A становится:

A = [12, 25, 50, 100]
B = [25, 50, 100, 12]

Наивным подходом было бы просто реализовать базовый алгоритм сортировки, который принимает 2 массива, и для каждого шага, который требуется для сортировки A , он выполняет тот же шаг на B , игнорируя его содержимое.Но это выглядит немного глупо - я думаю, что реализация структуры данных, которая связывает значения в этих двух массивах, а затем позволяет мне выполнять сортировку по одному из параметров, кажется гораздо более разумной.

Единственное предостережение: мне нужна структура объекта / данных, из которой я могу затем извлечь эти два массива, чтобы подключить его к старшим диаграммам.Кроме того, я помню, что читал, что спецификация JS не говорит о том, что обычные объекты JS должны поддерживать порядок, поэтому я не уверен, каким будет хороший подход.

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Я не думаю, что ваша первоначальная идея на самом деле , что плохая - просто отсортируйте один массив и измените порядок другого, игнорируя его содержимое.Однако я согласен с тем, что существует «лучший» подход, с точки зрения упрощения отслеживания и идентификации ваших данных.

Поскольку ваши два массива по сути являются парами {a, b}, вы можете иметь одинмассив, который содержит все данные:

const myData = [{a: 25, b: 50}, {a: 100, b: 12}, {a: 50, b: 100}, {a: 12, b: 25}];

Тогда будет довольно легко отсортировать ваш массив по любому ключу с помощью функции сортировки:

// Returns a sorting function that sorts your items by an arbitrary key
const sortFunction = key => {return (a, b) => a[key] > b[key]};

myData.sort(sortFunction("a"));
// myData is now sorted with "a" keys in ascending order
myData.sort(sortFunction("b"));
// myData is now sorted with "b" keys in ascending order

Если вы хотите разделитьСнова массив для двух отдельных массивов, просто используйте Array.map():

const aValues = myData.map(ea => ea.a);
const bValues = myData.map(ea => ea.b);
0 голосов
/ 18 октября 2018

Вы можете создать общий массив сортировки, который содержит индексы порядка сортировки.Затем вы можете сопоставить это с любым массивом, который вам нравится:

let A = [25, 100, 50, 12]
let B = [50, 12, 100, 25]

// sort order based on A will have the indexes in order of A's sort
let sort_order = Array.from(A, (_, i) => i).sort((a,b) => A[a] - A[b])

let A_sorted  = sort_order.map(i => A[i])
let B_sorted  = sort_order.map(i => B[i])

console.log(A_sorted, B_sorted)
0 голосов
/ 18 октября 2018

Один из вариантов - создать из каждого элемента объект со свойствами a и b, отсортировать этот массив объектов и затем снова извлечь их в массивы компонентов:

const A = [25, 100, 50, 12];
const B = [50, 12, 100, 25];
const arr = A.map((a, i) => ({ a, b:B[i] }));
arr.sort((item1, item2) => item1.a - item2.a);
const [newA, newB] = arr.reduce(([newA, newB], { a: itemA, b: itemB }) => {
  newA.push(itemA);
  newB.push(itemB);
  return [newA, newB];
}, [[],[]]);
console.log(newA, newB);

Хотя это может выглядеть немного более функциональным, ваша первоначальная реализация, хотя и наивная, вероятно, немного быстрее для огромных входных данных, потому что она не 'не требует создания промежуточных массивов и объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...