Javascript 1D и 2D массивы со строковыми индексами и .push ()? - PullRequest
0 голосов
/ 21 ноября 2018

Я работаю над программой Google Maps Javascript API и у меня возникли проблемы с настройкой массивов, как я и планировал.

Контекст: Когда карта инициализируется, файл Geojsonчитается и из его информации создается куча маркеров (красных штифтов).После создания эти маркеры затем группируются в кластер.Также обратите внимание, что каждая из этих записей имеет ClientType, который представляет собой 1 из ~ 6 строк, таких как 'Sales' или 'Utility'

Desire: Одна переменная для кластеров, var mapClusters []с валютами в качестве ClientTypes.Например, mapClusters ['Utility'] вернет один кластер размером ~ 6 в массиве, который объединяет маркеры с помощью ClientType = Utility.

Затем я хочу еще одну переменную для маркеров, var mapMarkers [] [].Например, mapMarkers ['Sales'] [3] будет 4-м маркером в группе Sales.Порядок объектов в этой группе «продажи» НЕ имеет значения.

Код:

var mapMarkers = [ ['Utility'], ['Court'], ['Sales'], ['Licensing'], ['Other'], ['Prospect'] ]; //2d array, ex: mapMarkers['Sales'][3]
var mapClusters = []; //1d array, ex: mapClusters['Utility']

....

( at the end of initMap() )
( for each entry in the GeoJson, generate var Marker for it and show on map. var clientType = the string value from the Geojson, such as 'Sales' )
mapMarkers[clientType].push(marker);

....

( after all markers have been generated, called for each Client Type )
mapClusters[clientType] = new MarkerCluster(...); //is null until first time this is called

Ошибки: У меня особенно проблемыс «mapMarkers [clientType] .push (marker)» и получая ошибку «Uncaught TypeError: Невозможно прочитать свойство« push »из неопределенного».Я также не уверен, правильно ли используется mapClusters, но не достиг этой части кода во время выполнения, чтобы получить какую-либо конкретную ошибку.

Спасибо за помощь!

1 Ответ

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

Кажется, у вас неправильная инициализация переменной mapMarkers для ожидаемых целей.Способ, которым вы инициализируете эту переменную, генерирует массив массивов (каждый из которых имеет длину, равную 1), то есть каждый массив имеет одну строку внутри.Как вы можете проверить на следующем примере, где я показываю, как управлять этой структурой:

var mapMarkers = [ ['Utility'], ['Court'], ['Sales'], ['Licensing'], ['Other'], ['Prospect'] ];

// Display the structure format:
console.log(mapMarkers);

// Display first array inside.
console.log("First array of mapMarkers: ", mapMarkers[0]);

// Display the first element of the first array.
console.log("First element inside first array: ", mapMarkers[0][0]);

// Push new element on first array.
mapMarkers[0].push("Hello");
console.log(mapMarkers);

Для вашей конкретной цели лучше использовать следующую инициализацию, представляющую объект со свойствами, где каждое свойство содержит пустой массив (при инициализации):

var mapMarkers = {'Utility': [], 'Court': [], 'Sales': [], 'Licensing': [], 'Other': [], 'Prospect': []};

Используя предыдущую инициализацию, вы можете манипулировать структурой так, как вы ожидаете, как вы можете проверить на следующем примере:

var mapMarkers = {"Utility": [], "Court": [], "Sales": [], "Licensing": [], "Other": [], "Prospect": []};

// Display the structure format:
console.log(mapMarkers);

// Display the array saved on the "Utility" property.
console.log("Utility array: ", mapMarkers["Utility"]);

// Push new elements on "Sales" array.
mapMarkers["Sales"].push("Sale1");
mapMarkers["Sales"].push("Sale2");
mapMarkers["Sales"].push("Sale3");

// Display the "Sales" array.
console.log("Sales Array: ", mapMarkers["Sales"]);

// Display second element of "Sales" array.
console.log("Second element of Sales array: ", mapMarkers["Sales"][1]);

// Display the structure after adding elements:
console.log(mapMarkers);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...