2013-01-24 86 views
1

我已经将JavaScript Spritesheet转换为2D整数数组,现在我试图将1个整数的2D数组分割为多个2D数组,使用1作为“分隔符”数。使用分隔符将2D数组划分为多个数组

Spritesheet 是否有任何方法使用分隔符号将下面的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图像分离。

+3

是的,肯定有。 – 2013-01-24 17:46:32

+1

所以...你想创建一个新的数组,每当你找到1? –

+1

@JesseJ:不,把2D阵列想象成一张地图。一些是墙壁,他想要得到房间。 – Bergi

回答

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; 
} 
+0

这是JSFiddle的改进版本:http://jsfiddle.net/jarble/cWYpr/11/ –

+0

此外,这里是原始JSFiddle上的版本:http://jsfiddle.net/jarble/cWYpr/12/ –

+0

...和[这里有漂亮的输出](http://jsfiddle.net/cWYpr/13/)。 – Bergi

0

你将不得不通过数组进行迭代,捕捉预览项目分成子阵列,只要你找到一个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)); 
+0

程序输出中的第一个数组是不正确的 - 它应该是'[[5,5,5],[5,5,4]]'而不是'[[5,5,5],[5,4,5]]'。 –

+0

@AndersonGreen我看到发生了什么,我没有垂直分割数组,只是水平地 –

相关问题