2013-01-24 1 views
1

Я преобразовал JavaScript-спрайт в 2D-массив целых чисел, и теперь я пытаюсь разбить 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 

Основное приложение для этого алгоритма, которое я имею в виду, - это разделение изображений спрайтов.

+3

Да, определенно есть. –

+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 Я вижу, что происходит, я не разбивал массив по вертикали, только по горизонтали –