使用分隔符将二维数组划分为多个数组
Posted
技术标签:
【中文标题】使用分隔符将二维数组划分为多个数组【英文标题】:Divide a 2D array into multiple arrays using a separator 【发布时间】:2013-01-08 13:39:12 【问题描述】:我已将 javascript spritesheet 转换为 2D 整数数组,现在我尝试将 2D 整数数组拆分为多个 2D 数组,使用 1 作为“分隔符”数字。
有没有什么办法可以使用分隔号将如下所示的 2D JavaScript 数组分隔成多个数组,如下所示?
function separate2DArray(arrToSeparate, separator)
//separate the 2D array into multiple 2D arrays, using a
//specific number as the separator
//array to separate:
[
[5, 5, 5, 1, 5, 4, 5],
[5, 5, 4, 1, 4, 3, 4],
[1, 1, 1, 1, 1, 1, 1], //1 is the "separator number", which splits the array
[9, 2, 1, 4, 2, 4, 5], //horizontally and vertically
]
//The array above would produce the following 2D arrays:
5 5 5
5 5 4
5 4 5
4 3 4
9 2
4 2 4 5
我想到的这个算法的主要应用是spritesheet图像分离。
【问题讨论】:
是的,肯定有。 所以...您想在找到 1 时创建一个新数组? @JesseJ:不,将二维数组视为地图。那些是墙,他想得到房间。 @BergI 这正是我想要做的。 :) 我添加了一个图像作为我正在使用的图像布局的示例。 @JustinBicknell:不,你的做法不同 【参考方案1】:鉴于分隔区域是矩形的,这将起作用:
function separate2DArray(array, sep)
//separate the 2D array into multiple 2D arrays, using a
//specific number as the separator
var result = [],
currentSubs = ; // using x coordinate as key
for (var y=0; y<array.length; y++)
var line = array[y],
subBegin = 0;
for (var x=0; x<=line.length; x++)
if (x == line.length || line[x] == sep)
if (subBegin < x)
var sub = line.slice(subBegin, x);
if (subBegin in currentSubs)
currentSubs[subBegin].push(sub);
else
currentSubs[subBegin] = [sub];
else // a line of separators, subBegin == x
if (subBegin in currentSubs)
result.push(currentSubs[subBegin]);
delete currentSubs[subBegin];
subBegin = x+1;
for (var begin in currentSubs)
result.push(currentSubs[begin]);
return result;
这里的结果只是一个非常简单的子区域数组,没有关于它们在原始区域中的位置的任何信息。改进版:
function separate2DArray(array, sep)
var result = [],
currentSubs = ;
for (var y=0; y<array.length; y++)
var line = array[y],
subBegin = 0;
for (var x=0; x<=line.length; x++)
if (x == line.length || line[x] == sep)
if (subBegin < x)
var subline = line.slice(subBegin, x);
if (! (subBegin in currentSubs))
var subarea = [];
result.push(x:x, y:y, area:subarea);
currentSubs[subBegin] = subarea;
currentSubs[subBegin].push(subline);
else
if (subBegin in currentSubs)
delete currentSubs[subBegin];
subBegin = x+1;
return result;
【讨论】:
另外,这里是 JSFiddle 上的原始版本:jsfiddle.net/jarble/cWYpr/12【参考方案2】:您必须遍历数组,每当找到 1 时将预览条目捕获到子数组中
http://jsfiddle.net/cWYpr/10/
var arr = [[5, 5, 5, 1, 5, 4, 5], [5, 5, 4, 1, 4, 3, 4], [1, 1, 1, 1, 1, 1, 1], [9, 2, 1, 4, 2, 4, 5]];
var twoD = [];
for (var x = 0; x < arr.length; x++)
var row = arr[x];
var subArray = [], subArrays=[];
for (var y = 0; y < row.length; y++)
if (row[y] == 1)
if (subArray.length) subArrays.push(subArray.slice(0));
subArray = [];
else
subArray.push(row[y]);
if (subArray.length) subArrays.push(subArray);
if(subArrays.length) twoD.push(subArrays);
console.log(twoD);
document.write(JSON.stringify(twoD));
【讨论】:
程序输出中的第一个数组不正确 - 它应该是[[5, 5, 5], [5, 5, 4]]
而不是 [[5, 5, 5], [5, 4, 5]]
。
@AndersonGreen 我知道发生了什么,我没有垂直分割数组,只是水平分割以上是关于使用分隔符将二维数组划分为多个数组的主要内容,如果未能解决你的问题,请参考以下文章