Сортировка первого массива на основе второй проблемы массива - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь отсортировать массив JavaScript на основе порядка сортировки во втором массиве.Я уже рассмотрел другие подобные вопросы здесь, в SO, и придумал приведенный ниже код.Если результат не соответствует ожидаемому.

var legends = ["Maths","Physics","English","French","Chemistry"];
var sortOrder = [1,400,300,200,-3];

legends.sort( function (a, b) {
    return sortOrder[legends.indexOf(a)] >= sortOrder[legends.indexOf(b)];   
  });


console.log(legends);

Требуемый результат -

["Chemistry", "Maths", "French", "English", "Physics"];
  • Химия обозначает порядок сортировки -3
  • Математика следующая вышеcount, то есть 1
  • Французский следующий более высокий счет, то есть 200

Я пытаюсь получить желаемый результат либо в чистом JS, либо с помощью D3js, не уверен, что я делаюэто правильно!

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Вы можете взять вспомогательный массив с индексами, отсортировать их и отобразить нужный массив.

var legends = ["Maths", "Physics", "English", "French", "Chemistry"],
    sortOrder = [1, 400, 300, 200, -3];

legends = [...legends.keys()]
    .sort((a, b) => sortOrder[a] - sortOrder[b])
    .map(i => legends[i]);        

console.log(legends);
0 голосов
/ 08 июня 2018

Попробуйте следовать

var legends = ["Maths","Physics","English","French","Chemistry"];
var sortOrder = [1,400,300,200,-3];

/* Create an array of objects of value index of sortOrder */
legends = Object.entries(sortOrder.reduce((a,v,i) => Object.assign(a, {[v]:i}), {}))
.sort((a,b) => a[0] - b[0]) // Sort array based on sortOrder values
.map(([s, i]) => legends[i]); // fetch items from legends based on sorted order 

console.log(legends);
0 голосов
/ 08 июня 2018

Вы почти правы, но в функции сортировки вы ссылаетесь на массив legends, который мутирует, поэтому индексы не соответствуют первоначальному порядку.

Чтобы продемонстрировать, что это так, вы можетескопировать массив и отсортировать копию:

var legends = ["Maths","Physics","English","French","Chemistry"];
var legendsToSort = ["Maths","Physics","English","French","Chemistry"];

var sortOrder = [1,400,300,200,-3];

legendsToSort.sort( function (a, b) {
    return sortOrder[legends.indexOf(a)] >= sortOrder[legends.indexOf(b)];   
  });


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