减少坐标对集合的地图

时间:2015-06-08 18:52:55

标签: javascript d3.js mapreduce

我已经成为开发人员已有几年了,我似乎没有得到的一个概念是map reduce。

我有一组定义正方形的坐标,每个值都是两个数组的数组。每个内部数组本身都是一个包含两个数值的数组。

//Example values:
//Each value is the following [[left, top],[right, bottom]]
var boundingBoxes = [
[[20, 20], [50, 30]],
[[15, 25], [35, 45]],
[[25, 25], [40, 40]]
]

我需要将这个集合缩减为一组坐标,这些坐标允许我定义一个矩形,该矩形围绕坐标在集合中的所有矩形。因此,每个左侧和顶部的最低值,以及右侧和底部的最高值。

//Output for above values should be
[[15, 20], [50, 45]]

进一步的背景。坐标的结构来自d3.path()。bounds(d)。我正在获得多个状态的边界并创建一个封装所有状态的边界框;用于放大地图上重新定义的状态集合。

1 个答案:

答案 0 :(得分:1)

如果你想用reduce来解决这个问题,那么下面的工作就可以完成:

var boundingBoxes = [
  [[20, 20], [50, 30]],
  [[15, 25], [35, 45]],
  [[25, 25], [40, 40]]
];

var result = boundingBoxes.reduce(function(prev,curr){
  var left = Math.min(prev[0][0], curr[0][0]),
      top = Math.min(prev[0][1], curr[0][1]),
      right = Math.max(prev[1][0], curr[1][0]),
      bottom = Math.max(prev[1][1], curr[1][1]);

  return [[left,top],[right,bottom]];
});

reduce的回调函数从数组中获取previouscurrent元素。您可以为第一个"之前的"设置初始值。作为reduce的第二个参数。如果省略初始值,则reduce从第一个和第二个元素开始。

您只需要比较每个值,并将元素与回调中的适当值一起返回。

相关问题