JS ES6 Как отсортировать массив по собственному шаблону? - PullRequest
0 голосов
/ 24 октября 2018

У меня проблемы.У меня есть массив со значением Uniq (без повторов), но когда-либо разной длины.Например, я получаю этот 1) массив:

['asd', 'asa','wsz', 'xssa', 'asad', 'casde']

он должен сортироваться по:

['wsz', 'asa', 'xssa', 'casde', 'asad', 'asd']

2) массив:

['asd', 'asa', 'xssa', 'asad', 'casde']

и должен сортироваться по:

['asa', 'xssa', 'casde', 'asad', 'asd']

3) Массив:

['asd', 'asa','wsz']

и он должен сортироваться по:

['wsz', 'asa', 'asd',]

Последовательность сортировки всегда должна быть такой же, как в первом ['wsz', 'asa', 'xssa', 'casde', 'asad', 'asd'].Если элемент меньше, то их просто не будет, но последовательность останется.

Как я могу создать шаблон для своих собственных значений и использовать их независимо от размера массива (размер всегда меньше размера шаблона)?

Ответы [ 3 ]

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

Один из вариантов - создать объект карты, использующий строку в качестве ключа и номер заказа в качестве значения.Используйте sort() для сортировки массива с использованием временного объекта.

let order = ['wsz', 'asa', 'xssa', 'casde', 'asad', 'asd'];
let temp = order.reduce((c, v, i) => Object.assign(c, {[v]: i}), {});

let arr = ['asd', 'asa', 'xssa', 'asad', 'casde'];

arr.sort((a, b) => temp[a] - temp[b]);

console.log(arr);

sort() необходимо пройти через каждый элемент и сравнить каждый.Один из способов избежать sort() - сделать new Set вашего массива.Затем с помощью filter() проверьте каждый элемент массива order.Если элемент существует в объекте Set, добавьте в новый массив.

let arr = ['asd', 'asa', 'xssa', 'asad', 'casde'];
let map = new Set(arr);

let order = ['wsz', 'asa', 'xssa', 'casde', 'asad', 'asd'];

let newArr = order.filter(o => map.has(o));

console.log(newArr);
0 голосов
/ 24 октября 2018

Вы можете использовать функцию sort () с помощью функции обратного вызова, где условием будут индексы вашего исходного массива.

function sortMyArray(a, b) {
  let array = ['asd', 'asa','wsz', 'xssa', 'asad', 'casde'];
  if (array.indexOf(a) < array.indexOf(b)) {
    return -1;
  }
  return 0;
}

let myarray = ['wsz', 'asa', 'asd',];
myarray = myarray.sort(sortMyArray);
0 голосов
/ 24 октября 2018

Используйте template.indexOf внутри вашей функции сортировки, чтобы определить местоположение элементов из данных в шаблоне.

var template = ['wsz', 'asa', 'xssa', 'casde', 'asad', 'asd'];

var data1 = ['asd', 'asa','wsz', 'xssa', 'asad', 'casde'];
var data2 = ['asd', 'asa','wsz']; 

function sortFunc(a, b) {
  return template.indexOf(a) - template.indexOf(b);
}

data1.sort(sortFunc);
data2.sort(sortFunc);

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