2016-09-01 4 views
1

Я никогда раньше не работал с JavaScript. Я пытаюсь создать карту, где разные слои могут быть скрыты для каждого пользователя. Я наткнулся на полезный пример на карте, в котором показан точный код на https://www.mapbox.com/mapbox-gl-js/example/toggle-layers/.map box js; скрыть и показать ярлык

Теперь, моя проблема в том, что у меня много точечных слоев разных величин, я был вынужден создать несколько слоев и отфильтровать их на основе требуемого атрибута, чтобы каждый элемент отображал эту конкретную величину. Тем не менее, я хочу, чтобы все эти точки были организованы в годы, поэтому я сгруппировал слои. Поэтому все имена слоев выглядят примерно так (2006_mag2,2006_mag8,2010_mag3 ...).

Однако, я хочу, чтобы функция hide/show показывала слои на основе лет. Поэтому я думал, что могу сделать своего рода оператора, как мы используем в sql (т. Е. «2006%» или оператор LIKE). Глядя на некоторые должности, многие люди используют «*» в JavaScript? Так это то, что это будет выглядеть для каждого слоя по отдельности перед:

var toggleableLayerIds = [ '2006_mag2', '2010_mag3' ]; 

for (var i = 0; i < toggleableLayerIds.length; i++) { 
    var id = toggleableLayerIds[i]; 
} 

и это моя неудачной попытки пытается сгруппировать несколько слоев вместе:

var toggleableLayerIds = [ '2006.*', '2008.*' ]; 

for (var i = 0; i < toggleableLayerIds.length; i++) { 
    var id = toggleableLayerIds[i]; 
} 

Любой инструктивный вам, ребята может предоставить будет очень признателен.

ответ

0

Вы можете попробовать использовать циклы с регулярным выражением для группировки слоев по дате. Извините, я изменил имя ваших переменных. Это даст вам объект с layerIds, сгруппированным по дате.

var layerIds = [ '2006_mag2', '2010_mag3', '2006_mag8', '2006_mag1', '2008_mag2']; 
 
    var dates = ['2006', '2010']; 
 
    var groupedLayers = {}; 
 

 
    //init your object to have a member for each date 
 
    //this could be done inside the loops below by testing if the array exists before pushing the matching layerId 
 
    for (var i=0; i < dates.length; i++) { 
 
     groupedLayers[dates[i]] = []; 
 
    } 
 
    
 
    //loop over your layerIds to match with the RegExp 
 
    for (var i=0; i < layerIds .length; i++) { 
 
     for (var j=0; j < dates.length; j++) { 
 
      var searchPattern = new RegExp('^' + dates[j]); 
 
      if (searchPattern.test(layerIds[i])) { 
 
       groupedLayers[dates[j]].push(layerIds[i]); 
 
      } 
 
     } 
 
    } 
 

 
    console.log(groupedLayers)

Пожалуйста, скажите мне, что точный результат вам нужно, чтобы я мог помочь вам больше.

+0

Благодарим за быстрый ответ. Цикл имеет смысл. Я просто надеюсь, что с каждым годом появятся кнопки справа от экрана. И как только кто-то нажимает кнопку, все точки, связанные с этим годом, исчезнут. Я не думаю, что это преуменьшение, чтобы сказать, что я понятия не имею, что я делаю. Вот jsfiddle, который удивляет, удивляет, я не могу работать. Какие-либо предложения? https://jsfiddle.net/albinoham/x1qvuzg9/2/#&togetherjs=UfvI3hbGSB – user6784706

+0

Я отредактировал jsFiddle, вам может потребоваться предоставить токен mapBox, чтобы он работал [https://jsfiddle.net/x1qvuzg9/4/ ] (https://jsfiddle.net/x1qvuzg9/4/) Карта не будет отображаться в jsfiddle, если вы не вернетесь правильно импортировать файлы mapBox. Я предлагаю скопировать/вставить javascript только в локальные html-файлы. –

+0

Ты абсолютная звезда. Спасибо, что нашли время. – user6784706

Смежные вопросы