如何在yandex地图上正确过滤数据?

时间:2019-02-24 15:36:59

标签: javascript yandex yandex-maps

我正在尝试过滤yandex地图上的数据。 CodePen Example

如果基站具有几个频段(2G,3G和4G),那么如果其中至少一个频段在滤波器中,则它应该出现在结果中。

如何在yandex地图上正确过滤数据?

我有带有listBoxItems = ['2G','3G','4G']的listBoxControl

我的过滤器功能如下:

function getFilterFunction(categories){
  return function(obj){
    let bsBands = obj.has_bands;
    /* How correct filter data? */
    return categories['2G'] && categories['3G'] && categories['4G'];
  }
}

GeoJSON看起来像这样:

{
"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"
        ]
    }]}

1 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。 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);
    }
}