作为输入,我收到两种类型的数组数组,这些数组由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]]]
是否有一种功能可以深度压扁这两种类型的数组?
编辑:由于阵列非常大,性能在这里非常重要
答案 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)
您可以在Underscore和lodash库中找到许多用于操作数组和集合的有用工具。
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来知道你正在使用哪种类型。