Эффективная сортировка неупорядоченного массива «подмножеств» на основе порядка уже отсортированного «главного» массива

1

У меня есть два массива идентификаторов. Один из них представляет собой нефильтрованный master массив, который был отсортирован на основе значений в отдельном объекте dataset, чьими ключами являются вышеупомянутые идентификаторы). Другой массив - это filtered подмножество master, которое сортируется так же, как и master. Вот так:

const dataset = {a: {...}, b: {...}, c: {...}, d: {...}, e: {...}, f: {...}, g: {...}}
const master = ['a', 'b', 'c', 'd', 'e']
const filtered = ['a', 'c', 'd']

Однако иногда меняются критерии сортировки, поэтому я повторно сортирую master массив. Затем я мог бы повторно фильтровать этот новый отсортированный массив, чтобы получить свой filtered массив, но то, что я бы предпочел, это просто отсортировать filtered массив на основе нового порядка master массива, поскольку я предполагаю, что это будет более эффективно, чем снова запустив фильтры.

Однако я не уверен, как это сделать. Для ясности я думаю, что мне нужен поток:

const mySort = (unsortedSubset, blueprint) => {
    // do sort here
}
const dataset = {a: {...}, b: {...}, c: {...}, d: {...}, e: {...}, f: 
const master = ['e', 'd', 'c', 'b', 'a']
const filtered = ['a', 'c', 'd']

const sortedFiltered = mySort(filtered, master)
console.log(sortedFiltered)
// ['d', 'c', 'a']
  • 0
    Насколько велики эти массивы? Если они не очень большие, вам, вероятно, лучше просто отсортировать оба с использованием обычного метода, чтобы избежать путаницы в коде для будущего сопровождающего (который может быть вами)
  • 0
    @PeterVanDrunen Эти массивы большие и часто сортируются и фильтруются. Проблема в том, что для сортировки / фильтрации сначала необходимо сопоставить значения в master с набором данных. Чтобы отсортировать отфильтрованное подмножество, вам также необходимо сопоставить все эти значения со значениями в наборе данных, что будет неэффективно с точки зрения времени и объема памяти.
Теги:
arrays
sorting

1 ответ

1

Вы можете отфильтровать основной массив с помощью фильтрованного массива для поиска.

const
    mySort = (subset, blueprint) => blueprint.filter(v => subset.includes(v));
    dataset = { e: {}, d: {}, c: {}, b: {}, a: {} },
    master = ['e', 'd', 'c', 'b', 'a'],
    filtered = ['a', 'c', 'd'],
    sortedFiltered = mySort(filtered, master);

console.log(sortedFiltered);

Версия с Set

const
    mySort = (subset, blueprint) => blueprint.filter(Set.prototype.has, new Set(subset));
    dataset = { e: {}, d: {}, c: {}, b: {}, a: {} },
    master = ['e', 'd', 'c', 'b', 'a'],
    filtered = ['a', 'c', 'd'],
    sortedFiltered = mySort(filtered, master);

console.log(sortedFiltered);
  • 0
    В чем преимущество метода Set ?
  • 0
    это обеспечивает более быстрый доступ для проверки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню