减少和连接(或深度展平)数组数组的最快方法

时间:2015-08-28 13:21:40

标签: javascript

作为输入,我收到两种类型的数组数组,这些数组由x和y坐标组成,表示多边形和多边形几何。

array1表示简单多边形几何体的坐标,array2表示多面体几何体:

var array1 = [[[0 , 0], [0, 1], [0 ,2]]]

var array2 = [[[[0, 0] , [0, 1], [0, 2]], [[1, 0], [1, 1], [1 ,2]]]]

多面体几何体(array2)由比简单多边形几何体(array1)深一层的数组数组表示。

我想展平这些数组以获得那些输出:

   if input is array1 type : array1_out = [[0, 0, 0, 1, 0, 2]]

   if input is array2 type : array2_out = [[0, 0, 0, 1, 0, 2], [1, 0, 1, 1, 1, 2]]

我的功能如下:

for (i=0; i < array_input.length; i++){
    var array_concat = array_input[i].reduce(function(a, b){
        return a.concat(b);
    });
}

使用上述功能,array1的输出正确,但array2的输出如下:

[[[0, 0] ,[0, 1], [0, 2]], [1, 0], [1, 1], [1, 2]]]

是否有一种功能可以深度压扁这两种类型的数组?

编辑:由于阵列非常大,性能在这里非常重要

2 个答案:

答案 0 :(得分:1)

您可以为您的函数添加一个小包装器,可以检查输入中的类型和位修改输入

function getDeepLength(arr) {
  for (var i = 0, cur = arr; cur[0] instanceof Array; i++, cur = cur[0]);
  return i;
}

function Flatten(array_input) {
  var array_concat = [];
  for (i = 0; i < array_input.length; i++) {
    array_concat.push(array_input[i].reduce(function(a, b) {
      return a.concat(b);
    }));
  }
  return array_concat;
}

function Wrapper(arr) {
  var deep = getDeepLength(arr);
  var cur = arr;
  if (deep > 2) {
    for (var i = deep - 2; i > 0; i--, cur = cur[0]);
  }
  return Flatten(cur)
}

var array1 = [
  [
    [0, 0],
    [0, 1],
    [0, 2]
  ]
];

var array2 = [
  [
    [
      [0, 0],
      [0, 1],
      [0, 2]
    ],
    [
      [1, 0],
      [1, 1],
      [1, 2]
    ]
  ]
];

document.getElementById('r').innerHTML = "array1: " 
+ JSON.stringify(array1)+"<br/>"
+ "flat array1: "+JSON.stringify(Wrapper(array1))+"<br/>"
+ "array2: "+JSON.stringify(array2)+"<br/>"
+ "flat array2: "+JSON.stringify(Wrapper(array2));
<div id='r'></div>

答案 1 :(得分:1)

您可以在Underscorelodash库中找到许多用于操作数组和集合的有用工具。

var arrays1 = [[[0 , 0], [0, 1], [0 ,2]]];
var array2 = [[[[0, 0] , [0, 1], [0, 2]], [[1, 0], [1, 1], [1 ,2]], ]];

var array1_out = flattenSimple(arrays1);
console.log(JSON.stringify(array1_out));

var array2_out = flattenMultiple(array2);
console.log(JSON.stringify(array2_out));

function flattenSimple(array_input) {    
    return _.flatten(array_input);
}

function flattenMultiple(array_input) {
    array_input = array_input[0];
    return array_input.map(function(a) {
        return _.flatten(a);
    });
}

将产生您正在寻找的输出。我把它分成了每种类型的扁平fn,但你可以使用带有标志或更复杂逻辑的相同fn来知道你正在使用哪种类型。

Fiddle