Эффективная сортировка неупорядоченного массива «подмножеств» на основе порядка уже отсортированного «главного» массива - PullRequest
0 голосов
/ 29 октября 2018

У меня есть два массива идентификаторов. Один из них - это нефильтрованный массив 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']

1 Ответ

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

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

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...