Найти вложенные объекты и сохранить в переменной - PullRequest
0 голосов
/ 21 сентября 2018

Я работаю с TomTom Maps и мне нужно получить все маркеры, которые отображаются на карте.

Я получил всю информацию, но проблема заключается в том, что они группируют маркеры.

У меня есть следующая схема:

задача

Для каждого элемента у меня может быть маркер , которыйэто информация, которую мне нужно хранить.Я могу иметь _childClusters , который содержит тот же элемент.

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

Спасибо, ребята!

Редактировать:

Основываясь на коде @thedude, я создал функцию, которая возвращает мне массив всех выводов:

var markerList = new Array();

        function getMarkers(featureBounds) {
            featureBounds.map(o => {
                // console.log('o :', o);
                if (o._childCount) {
                    getMarkers(o._childClusters)
                } 
                o._markers.map(marker => {
                    // console.log('marker :', marker);
                    if (marker.propData) {
                        markerList.push(marker)
                    }
                })
            })

        }
        
        getMarkers(featureBounds)
        console.log('markerList :', markerList);

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Не суперэффективный, но очень "функциональный", при условии, что data содержит данные в вашем вопросе:

data.flatMap(o => o._markers)
    .concat(
         data.flatMap(o => o. _childClusters)
             .filter(Boolean)
             .flatMap(o => o._markers)
    )

Это работает в Chrome как есть, вам может понадобиться что-то вроде flatMap для других браузеров

- редактировать -

В случае более глубокого _childClusters вы можете использовать рекурсивное решение:

function getMarkers(list) {
    return list.flatMap(o => 
         o._markers.concat(...getMarkers(o._childClusters || []))
    )
}

getMarkers(data)
0 голосов
/ 21 сентября 2018

Насколько я могу судить, глубина _markers составляет два слоя.Сделайте это: (Top - родительский объект, который показан на предоставленном вами изображении).

let clusters = [];
let markers = [];
for(i = 0; i < Top.length; i++){
   clusters.push(Top[i]._childClusters);
}
for(x = 0; x < clusters.length; x++){
  markers.push({x: clusters[x]._markers});
}
for(z = 0; z < markers.length; z++){
  // do something with the marker.
}

Это безумно неэффективно, и если кто-то может найти лучший путь, сделайте это.

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