madrogalo
@madrogalo
Кратко о себе

Как отсортировать массив так, чтобы элементы располагались в том же порядке, что и в другом массиве?

Есть массив:

["290", "999", "222", "333", "987", "309", "666"]

Нужно расположить его элементы в том же порядке, что и в этом массиве:

["999", "222", "666"]

И на выходе получить:

["999", "222", "666", "290", "333", "987", "309"]
  • Вопрос задан
  • 137 просмотров
Решения вопроса 2
@asaiyo
let allElems = ["290", "999", "222", "333", "987", "309", "666"];
let pattern = ["999", "222", "666"];
let goodElems = []; 
let badElems = [];

for (let elem of allElems){
  pattern.includes(elem) ? goodElems.push(elem) : badElems.push(elem);
}

let filteredElems = goodElems.concat(badElems);
console.log(filteredElems);
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
Сортируем существующий массив:

function sort(arr, order, key = n => n) {
  const positions = new Map(order.map((n, i) => [ n, i ]));
  const getPosition = n => positions.get(key(n)) ?? Number.MAX_SAFE_INTEGER;

  return arr.sort((a, b) => getPosition(a) - getPosition(b));
}

Собираем отсортированный новый:

function sorted(arr, order, key = n => n) {
  const ordered = new Map(order.map(n => [ n, [] ]));
  const unordered = [];

  arr.forEach(n => (ordered.get(key(n)) ?? unordered).push(n));

  return [].concat(...ordered.values(), unordered);
}

Примеры использования:

a1 = [ '999', '290', '999', '222', '333', '987', '309', '666', '999' ];
a2 = [ '999', '222', '666' ];
sorted(a1, a2) // [ '999', '999', '999', '222', '666', '290', '333', '987', '309' ]


a1 = [ 12, 34, 6, 2, 55, 523, 23, 333, 16, 51 ];
a2 = [ 3, 5, 2 ];
sorted(a1, a2, n => +`${n}`[0]) // [ 34, 333, 55, 523, 51, 2, 23, 12, 6, 16 ]


a1 = [ 666, 'xxx', () => [], true, 1, () => null, false, 'aaa', [0] ];
a2 = [ 'boolean', 'string', 'function' ];
sort(a1, a2, n => typeof n);
a1 // [ true, false, 'xxx', 'aaa', () => [], () => null, 666, 1, [ 0 ] ]
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы