Reputation: 11
I'm trying to filter data on yandex maps. CodePen Example
If the base station has several bands (2G, 3G and 4G), then it should be in the results if at least one of its band is in the filter.
How correct filter data on yandex maps?
I have listBoxControl with listBoxItems = ['2G', '3G', '4G']
My filter function looks like this:
function getFilterFunction(categories){
return function(obj){
let bsBands = obj.has_bands;
/* How correct filter data? */
return categories['2G'] && categories['3G'] && categories['4G'];
}
}
GeoJSON looks like this:
{
"count": 4,
"next": null,
"previous": null,
"type": "FeatureCollection",
"features": [
{
"id": 1,
"region_prefix": "97",
"cell_site_number": 1,
"description": "",
"address": "",
"commissioning": "",
"bs_id": "",
"height_asl": 0,
"bands": [
{
"name": "2G",
"frequency": "900"
},
{
"name": "2G",
"frequency": "1800"
},
{
"name": "3G",
"frequency": "2100"
},
{
"name": "4G",
"frequency": "1800"
},
{
"name": "4G TDD",
"frequency": "2600"
}
],
"status": true,
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [55.755815, 37.613]
},
"properties": {
"balloonContentHeader": "balloonContentHeader",
"balloonContentBody": "balloonContentBody",
"balloonContentFooter": "balloonContentFooter",
"clusterCaption": "clusterCaption",
"hintContent": "hintContent",
"iconCaption": "2G 3G 4G"
},
"has_bands": [
"3G",
"2G",
"4G"
]
},
{
"id": 2,
"region_prefix": "97",
"cell_site_number": 2,
"description": "",
"address": "",
"commissioning": "",
"bs_id": "",
"height_asl": 0,
"bands": [
{
"name": "2G",
"frequency": "900"
},
{
"name": "2G",
"frequency": "1800"
},
{
"name": "3G",
"frequency": "2100"
},
{
"name": "4G",
"frequency": "1800"
},
{
"name": "4G TDD",
"frequency": "2600"
}
],
"status": true,
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [55.759, 37.613]
},
"properties": {
"balloonContentHeader": "balloonContentHeader",
"balloonContentBody": "balloonContentBody",
"balloonContentFooter": "balloonContentFooter",
"clusterCaption": "clusterCaption",
"hintContent": "hintContent",
"iconCaption": "2G 3G 4G"
},
"has_bands": [
"3G",
"2G",
"4G"
]
},
{
"id": 3,
"region_prefix": "97",
"cell_site_number": 3,
"description": "",
"address": "",
"commissioning": "",
"bs_id": "",
"height_asl": 0,
"bands": [
{
"name": "3G",
"frequency": "2100"
}
],
"status": true,
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [55.7204, 37.6167]
},
"properties": {
"balloonContentHeader": "balloonContentHeader",
"balloonContentBody": "balloonContentBody",
"balloonContentFooter": "balloonContentFooter",
"clusterCaption": "clusterCaption",
"hintContent": "hintContent",
"iconCaption": "3G"
},
"has_bands": [
"3G",
]
},
{
"id": 4,
"region_prefix": "97",
"cell_site_number": 4,
"description": "",
"address": "",
"commissioning": "",
"bs_id": "",
"height_asl": 0,
"bands": [
{
"name": "4G",
"frequency": "1800"
},
{
"name": "4G TDD",
"frequency": "2600"
}
],
"status": true,
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [55.7704, 37.6119]
},
"properties": {
"balloonContentHeader": "balloonContentHeader",
"balloonContentBody": "balloonContentBody",
"balloonContentFooter": "balloonContentFooter",
"clusterCaption": "clusterCaption",
"hintContent": "hintContent",
"iconCaption": "4G"
},
"has_bands": [
"4G"
]
}]}
Upvotes: 0
Views: 153
Reputation: 11
I solved this issue myself. CodePen Example
function getBand(e, i, a){
let Band = this.valueOf();
return e === Band;
}
function getFilterFunction(categories){
return function(obj){
let bsBands = obj.has_bands;
let has2G = bsBands.find(getBand, '2G');
let has3G = bsBands.find(getBand, '3G');
let has4G = bsBands.find(getBand, '4G');
return (categories['2G'] && has2G) || (categories['3G'] && has3G) || (categories['4G'] && has4G);
}
}
Upvotes: 1