部分展平多维数组

时间:2016-07-14 20:18:50

标签: javascript arrays multidimensional-array coordinates

我有一系列的轮廓和点。对于大纲,调用outline.geometry.coordinates会生成一个多维坐标数组:

[[[-72.68639118392117,41.66733032827929],[-72.68630366033922,41.667449647115724], ...]] 

对于一个点,调用point.geometry.coordinates会产生一个坐标的一维数组:

[-72.78630766033722,41.767349642115724]

点和轮廓都保存在一个数组中。我想最终得到一个所有坐标对的数组,例如:

 [[[-72.68639118392117,41.66733032827929],[-72.68630366033922,41.667449647115724],[-72.78630766033722,41.767349642115724], ...]]

我尝试过的事情

首先,我尝试获取所有坐标,其中geometries是我的轮廓和点数组:

var coordinates = geometries.map(function(outline) {return outline.geometry.coordinates});

毫不奇怪,这会创建以下数组:

[[[[-72.68639118392117,41.66733032827929],[-72.68630366033922,41.667449647115724], ...]], [-72.78630766033722,41.767349642115724]]

展平此数组会导致配对失去坐标对,因此我不完全确定如何解决这个问题。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

一种方法是标准化坐标输出。如果outline s为您提供了一组配对坐标,您可以让point通过将其包装为单个元素数组来执行相同操作。

<强>概要

[[a, b], [c, d], [e, f], ...]

<强>点

[[a, b]]

这样当你将它们组合起来时,它们都具有相同的形状/维度。此时,您可以使用@dandavis技术进行一次展平。

如果您能够使用instanceof来确定您的对象是大纲还是点,则可以使用以下内容。

var coordinates = geometries.map(function(outline_or_point) {
  return outline_or_point instanceof outline ? outline.geometry.coordinates : [point.geometry.coordinates];
});

如果无法instanceof,您可以进行一些鸭子打字,例如,检查outline_or_point是数组还是数字。

var coordinates = geometries.map(function(outline_or_point) {
  return typeof outline_or_point[0] == 'number' ? [point.geometry.coordinates] : outline.geometry.coordinates;
});

答案 1 :(得分:1)

这个怎么样?

var geometries = [
    // point
    {
        geometry: {
            coordinates: [1, 2],
        },
    },

    // outline
    {
        geometry: {
            coordinates: [
                [
                    [3, 4],
                    [5, 6],
                ],
            ],
        },
    },
];

var coordinates = geometries.map(function(outline) {
  var coords = outline.geometry.coordinates;
  if (typeof coords[0] === 'number') {
    return [coords];
  } else {
    return coords[0];
  }
}).reduce(function (prev, next) {
    return prev.concat(next);
}, []);

console.log(coordinates);

// Output:
// [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ]