首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配两个不同数组中的两个项

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

Stack Overflow用户
提问于 2018-11-15 21:47:52
回答 1查看 127关注 0票数 0

我正在使用Jvectormap,并将一个数组设置为"areas“,将国家组合在一起进行选择,这是可行的。下一步是给阵列上的每个国家颜色。所以我可以在每个数组中为每个国家定义不同的颜色。

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

此外,如何分配给单击函数:

代码语言:javascript
复制
$("#mp-cyprus-A").click(function(){
    $('#world-map').vectorMap('setSelectedRegions', ['areas[1]']);
});

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

代码语言:javascript
复制
  //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();
  }

不起作用的代码的一部分:为每个“区域”设置数组。如果相关数组位于“区域”和“区域”之间,则应用该方法。

代码语言:javascript
复制
   // 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;
              }

矢量地图说明:

代码语言:javascript
复制
$('#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;
      }
    });

应用面积滤波器

代码语言:javascript
复制
    (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);
          }
        }
      }
    })();

});

更新:

代码语言:javascript
复制
//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);         
                }


       },
});   
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-15 22:24:40

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

代码语言:javascript
复制
Array [
  Array [
    Object {
      key: value
    }
  ]
]

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

我更喜欢使用jQuery $.each(),它和.forEach()一样。

代码语言:javascript
复制
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");
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

控制台将显示:

代码语言:javascript
复制
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

如果您只是简单地为“国家代码”分配颜色,最好是创建一个简单的对象:

代码语言:javascript
复制
var areacolors = {
  'BE': '#4E7387',
  'FR': '#333333',
  'BG': '#89AFBF',
  'DK': '#817F8E',
  'HR': '#344B5E',
  'FI': '#344B5E',
  'BY': '#344B5E',
  'GR': '#344B5E'
};

然后,如果您知道“国家代码”,您可以简单地调用它的索引:

代码语言:javascript
复制
map.series.regions[0].setValues(areacolors.GR); // Dot Notation preferred

代码语言:javascript
复制
map.series.regions[0].setValues(areacolor['GR']);

代码语言:javascript
复制
var cc = "GR";
map.series.regions[0].setValues(areacolor[cc]);

我不熟悉你使用的这个插件,所以我不能说如何设置正确的值,我只是用你的例子来澄清我的观点。

希望这能有所帮助。

更新1

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

还应考虑这一点:

代码语言:javascript
复制
var areacolors = {
  'BE': '#000000',
  'FR': '#333333',
  'BG': '#000000',
  'DK': '#817F8E',
  'HR': '#000000',
  'FI': '#344B5E',
  'BY': '#344B5E',
  'GR': '#344B5E'
};

然后:

代码语言:javascript
复制
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()函数可以非常有助于诊断问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53328356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档