匹配两个不同数组中的两个项目

时间:2018-11-15 21:47:52

标签: jquery jvectormap

我正在使用Jvectormap,并已将一个数组设置为“区域”以将要选择的国家/地区组合在一起,这是可行的。下一步是为阵列上的每个国家/地区指定颜色。因此,我可以为每个阵列中的每个国家/地区定义不同的颜色。

英国在数组1中可能是粉红色,但在数组2中是绿色。

我该如何分配点击功能:

$("#mp-cyprus-A").click(function(){
    $('#world-map').vectorMap('setSelectedRegions', ['areas[1]']);
});

用于添加区域集,然后为每个区域添加颜色集的代码:

  //MAP CONTROLS
$(function(){
  var areas = [];
  areas[0] = [];
  areas[2] = ["FR","BG","DK","HR","DE","BA","XK","CH","EE","IS","AL","IT","CZ","GB","IE","ES","ME","MD","RO","RS","MK","SK","SI","UA","SE","AT"];
  areas[2] = ["BE","FR","BG","DK","HR","DE","BA","HU","FI","BY","GR","NL","PT","NO","LV","LT","LU","XK","CH","EE","IS","AL","IT","CZ","GB","IE","ES","ME","MD","RO","RS","MK","SK","SI","UA","SE","AT"];
  areas[3] = ["CA"];
  areas[4] = ["CA"];
  areas[5] = ["CA"];
  areas[6] = ["CA"];

  function selectArea(code){
    var mapObj = $("#world-map").vectorMap("get", "mapObject");
    areas.forEach(function(area) {
      if(area.indexOf(code)>-1) {
        mapObj.setSelectedRegions(area);
        return;
      }
    });
  }

  function clearAll(){
    var mapObj = $("#world-map").vectorMap("get", "mapObject");
    mapObj.clearSelectedRegions();
  }

无效的部分代码:为每个“区域”设置数组。并将其应用于“ areas”和“ areacolor”之间的对应数组。

   // Area Colors
      var areacolor = [];
        areacolor[0] = [
            {'BE': '#4E7387'},
            {'FR': '#333333'},
            {'BG': '#89AFBF'},
            {'DK': '#817F8E'},
            {'HR': '#344B5E'},
            {'FI': '#344B5E'},
            {'BY': '#344B5E'},
            {'GR': '#344B5E'}
        ]
        areacolor[1] = [
            {'BE': '#4E7387'},
            {'FR': '#333333'},
            {'BG': '#89AFBF'},
            {'DK': '#817F8E'},
            {'HR': '#344B5E'},
            {'FI': '#344B5E'},
            {'BY': '#344B5E'},
            {'GR': '#344B5E'}
        ]
        areacolor[2] = [
            {'BE': '#4E7387'},
            {'FR': '#333333'},
            {'BG': '#89AFBF'},
            {'DK': '#817F8E'},
            {'HR': '#344B5E'},
            {'FI': '#344B5E'},
            {'BY': '#344B5E'},
            {'GR': '#344B5E'}
        ]

        function selectArea(color){
            var mapObj = $("#world-map").vectorMap("get", "mapObject");
            areascolor.forEach(function(color) {
              if(color.indexOf(color)>-1) {
                map.series.regions[0].setValues(areacolor[0]);
                return;
              }

矢量地图初始化:

$('#world-map').vectorMap({
    map: 'world_mill',
    backgroundColor: '#5288F9',
    markersSelectable:'false',
    regionsSelectableOne: 'false',
    regionsSelectable: 'true',
    regionStyle: {
        initial: {
          fill: "lightgrey"
        },
        selected: {
          fill: "darkseagreen"
        }
      },
    onRegionClick: function(e, code){
        clearAll();
        selectArea(code);
        return false;
      }
    });

应用区域过滤器

    (function () {
      // Collect the rest of the World
      var mapObj = $("#world-map").vectorMap("get", "mapObject");
      var states = areas.join(",");
      for(var code in mapObj.regions) {
        if(mapObj.regions.hasOwnProperty(code)) {
          if(states.indexOf(code) == -1) {
            areas[0].push(code);
          }
        }
      }
    })();

});

更新:

//MAP CONTROLS
var areacolors0  = {
    'BE': '#4E7387',
    'FR': '#333333',
    'BG': '#89AFBF',
    'DK': '#817F8E',
    'HR': '#344B5E',
    'FI': '#344B5E',
    'BY': '#344B5E',
    'GR': '#344B5E'
  };
  var areacolors1 = {
    'BE': '#000000',
    'FR': '#333333',
    'BG': '#000000',
    'DK': '#817F8E',
    'HR': '#000000',
    'FI': '#344B5E',
    'BY': '#344B5E',
    'GR': '#344B5E'
  };
    $('#world-map').vectorMap({
        map: 'world_mill',
        backgroundColor: '#5288F9',
        markersSelectable:'false',
        regionsSelectableOne: 'false',
        regionsSelectable: 'true',
        regionStyle: {
            initial: {
              fill: "lightgrey"
            },
            selected: {
              fill: "darkseagreen"
            }
          },
          onRegionClick: function (event, code) {
            var map = $('#world-map').vectorMap('get', 'mapObject');
            var name = map.getRegionName(code);
            if(name == GR) {
            map.series.regions[0].setValues(areacolors.GR);      
            }
            if(name == CH) {
                map.series.regions[0].setValues(areacolors1.CH);         
                }


       },
});   

1 个答案:

答案 0 :(得分:1)

由于数据结构的复杂性,您需要进行更深层次的迭代。所以你有:

Array [
  Array [
    Object {
      key: value
    }
  ]
]

因此,要查找与特定值匹配的项,您需要迭代初始数组,迭代每个元素中的数组项以及迭代矩阵中的每个对象。

我更喜欢使用jQuery $.each(),它与.forEach()的想法相同。

var areacolor = [];
areacolor[0] = [{
    'BE': '#4E7387'
  },
  {
    'FR': '#333333'
  },
  {
    'BG': '#89AFBF'
  },
  {
    'DK': '#817F8E'
  },
  {
    'HR': '#344B5E'
  },
  {
    'FI': '#344B5E'
  },
  {
    'BY': '#344B5E'
  },
  {
    'GR': '#344B5E'
  }
]
areacolor[1] = [{
    'BE': '#4E7387'
  },
  {
    'FR': '#333333'
  },
  {
    'BG': '#89AFBF'
  },
  {
    'DK': '#817F8E'
  },
  {
    'HR': '#344B5E'
  },
  {
    'FI': '#344B5E'
  },
  {
    'BY': '#344B5E'
  },
  {
    'GR': '#344B5E'
  }
]
areacolor[2] = [{
    'BE': '#4E7387'
  },
  {
    'FR': '#333333'
  },
  {
    'BG': '#89AFBF'
  },
  {
    'DK': '#817F8E'
  },
  {
    'HR': '#344B5E'
  },
  {
    'FI': '#344B5E'
  },
  {
    'BY': '#344B5E'
  },
  {
    'GR': '#344B5E'
  }
];

function selectArea(color) {
  //var mapObj = $("#world-map").vectorMap("get", "mapObject");
  $.each(areacolor, function(k, ac) {
    console.log("Examine areacolor[" + k + "]");
    $.each(ac, function(i, area) {
      $.each(area, function(c, clr) {
        if (clr.indexOf(color) === 0) {
          console.log("Color Found: " + c + ", " + clr);
          //map.series.regions[0].setValues(areacolor[0]);
        }
      });
    });
  });
}

selectArea("#344B5E");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

控制台将显示:

Examine areacolor[0]
Color Found: HR, #344B5E
Color Found: FI, #344B5E
Color Found: BY, #344B5E 
Color Found: GR, #344B5E
Examine areacolor[1]
Color Found: HR, #344B5E
Color Found: FI, #344B5E
Color Found: BY, #344B5E
Color Found: GR, #344B5E
Examine areacolor[2]
Color Found: HR, #344B5E
Color Found: FI, #344B5E
Color Found: BY, #344B5E
Color Found: GR, #344B5E

如果您只是为国家/地区代码分配颜色,则最好制作一个简单的对象:

var areacolors = {
  'BE': '#4E7387',
  'FR': '#333333',
  'BG': '#89AFBF',
  'DK': '#817F8E',
  'HR': '#344B5E',
  'FI': '#344B5E',
  'BY': '#344B5E',
  'GR': '#344B5E'
};

然后,如果您知道国家/地区代码,则可以简单地将其称为索引:

map.series.regions[0].setValues(areacolors.GR); // Dot Notation preferred

map.series.regions[0].setValues(areacolor['GR']);

var cc = "GR";
map.series.regions[0].setValues(areacolor[cc]);

我不熟悉您使用的这个插件,因此我无法谈论如何设置适当的值,我只是使用您的示例来阐明我的观点。

希望这会有所帮助。

更新1

您更新的代码似乎正确。我会检查控制台是否有任何警报或错误。

也考虑一下:

var areacolors = {
  'BE': '#000000',
  'FR': '#333333',
  'BG': '#000000',
  'DK': '#817F8E',
  'HR': '#000000',
  'FI': '#344B5E',
  'BY': '#344B5E',
  'GR': '#344B5E'
};

然后:

onRegionClick: function (event, code) {
  var map = $('#world-map').vectorMap('get', 'mapObject');
  var name = map.getRegionName(code);
  console.log("Name: " + name + ", Color: " + areacolors[name], map);
  map.series.regions[0].setValues(areacolors[name]);      
}

看来所有颜色都是相同的,所以我看不到多个数据集的好处。只需全部使用一个即可。此外,console.log()函数对于诊断问题也非常有帮助。