@Artemio95

Как отфильтровать массив по цепочке?

Есть, к примеру, массив из объектов. Пример:
const initial = 1
const arr = [
                    { name: '1', parentId: 1, id: 2 },
                    { name: '2', parentId: 2, id: 3 },
                    { name: '3', parentId: 1, id: 4 },
                    { name: '3', parentId: 4, id: 5 }
                ];

Как отфильтровать следующим образом: сначала по начальному значению смотрим, есть ли такой parent_id у кого-то в массиве. Если есть, берём его id. Далее, у найденного есть id: 2, смотрим, есть ли у массива объект с parent_id: 2, видим, что есть, берем и его. И так далее. Допустим, мы нашли несколько объектов с одинаковым parent_id, следовательно, уже смотрим из нескольких id и также сверяем. На примере выше выходит такая цепочка - по начальному значению мы нашли объекты с id 2 и 4, далее смотрим, у кого есть в parent_id 2 и 4, первое находим и берём его id 3, второе находим и берём его id 5. Получился массив с id. Объектов с одинаковых parent_id может быть не 1 и 2, а множество
  • Вопрос задан
  • 113 просмотров
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Ответ написан
Комментировать
Alexandroppolus
@Alexandroppolus
кодир
Задачу лучше разбить на два этапа:
1) препроцессинг - построение карты
2) фильтр уже по готовой карте
это на случай, если массив один, а фильтроваться будет многократно - тогда карту можно переиспользовать
function createMap(arr) {
    const map = new Map();
    
    arr.forEach(a => {
        let childs = map.get(a.parentId);
        if (!childs) {
            map.set(a.parentId, childs = []);
        }
        childs.push(a);
    });

    return map;
}

function filter(map, initial) {
    const result = (map.get(initial) || []).slice();
    for (let i = 0; i < result.length; ++i) {
        result.push(...(map.get(result[i].id) || []));
    }

    return result;
}

// использование
const initial = 1
const arr = [
                    { name: '1', parentId: 1, id: 2 },
                    { name: '2', parentId: 2, id: 3 },
                    { name: '3', parentId: 1, id: 4 },
                    { name: '3', parentId: 4, id: 5 }
                ];

var map = createMap(arr);
console.log(filter(map, initial));
console.log(filter(map, 2));
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы