Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign Skriptwerkstatt » mehrdimensionales Array reduzieren

mehrdimensionales Array reduzieren

da-tex
Beiträge gesamt: 67

2. Jul 2013, 10:29
Bewertung:

gelesen: 938

Beitrag als Lesezeichen
Hallo an alle,
ich versuche gerade ein mehrdimensionales array auf die nötigsten werte zu reduzieren. Dazu folgendes Beispiel:

Code
0 10 15 
0 21 26
0 27 31
1 3 15
1 10 13
1 15 21
2 38 55
3 8 21
3 22 41


Die erste Spalte stellt die Seitenzahl dar, die zweite Spalte die y1-Koordinate und die dritte die y2-Koordinate.
Sinn ist es, pro Seite die erste y1-Koordinate und die letzte y2-Koordinate zu extrahieren und diese in ein neues mehrdimensionales array zu schreiben.

Das Ergebnis sollte wie folgt aussehen:
Code
0 10 31 
1 3 21
2 38 55
3 8 41


Mit nachfolgendem Code gelingt es die Werte in ein eindimensionales Array zu schreiben.
Code
var _array = [ 
[0,10,15],
[0,21,26],
[0,27,31],
[1,3,15],
[1,10,13],
[1,15,21],
[2,38,55],
[3,8,21],
[3,22,41],
]

if(_array.length>1){
_finalArray = [[_array[0][0], _array[0][1]]];
for(var a = 1; a<_array.length; a++){
if(_array[a-1][0] != _array[a][0]){
_finalArray.push(_array[a-1][2]);// letzte y2-Koordinate aus vorhergehendem block
_finalArray.push(_array[a][0]);
_finalArray.push(_array[a][1]);
}
if(a==_array.length-1) _finalArray.push(_array[a][2]);
}
}

$.writeln (_finalArray)


Es wäre schön, wenn mir jemand einen Denkanstoß geben kann, damit die Werte in ein dreidimensionales Array geschrieben werden.

Danke im Voraus
Philipp

(Dieser Beitrag wurde von da-tex am 2. Jul 2013, 10:30 geändert)

mehrdimensionales Array reduzieren

WernerPerplies
Beiträge gesamt: 2762

2. Jul 2013, 14:36
Bewertung:

gelesen: 891

Beitrag als Lesezeichen
Hallo Philipp,

Code
    /*array*/Array.prototype.sortThis=function(/*String*/field, reverse) 
{
if (reverse == null) var reverse = false;
if (reverse) return this.sort(sortthisDown);
else return this.sort(sortthisUp);

/*int*/function sortthisUp(e1, e2)
{
if (field==null)
{
if (e1<e2) return -1;
if (e1>e2) return 1;
return 0;
}
else
{
if (e1[field]<e2[field]) return -1;
if (e1[field]>e2[field]) return 1;
return 0;
}
}
/*int*/function sortthisDown(e1, e2)
{
if (field==null)
{
if (e1>e2) return -1;
if (e1<e2) return 1;
return 0;
}
else
{
if (e1[field]>e2[field]) return -1;
if (e1[field]<e2[field]) return 1;
return 0;
}
}
}
main();

function main()
{
/*Array*/var toExtract = [[0,21,26],[0,27,31],[1,3,15],[1,10,13],[2,38,55],[3,8,21],[3,22,41],[0,10,15],[1,15,21]];
// sort pages
toExtract.sortThis(0);
/*Array*/var result = new Array();
var i = 0;
if (toExtract.length == 0) return;
/*object*/var page = new Page(toExtract[i][0], [toExtract[i][1]], [toExtract[i][2]]);
for(i=1; i<toExtract.length; i++)
{
if (toExtract[i-1][0]== toExtract[i][0])
{
page.y1.push(toExtract[i][1]);
page.y2.push(toExtract[i][2]);
}
else
{
result.push(page);
page = new Page(toExtract[i][0], [toExtract[i][1]], [toExtract[i][2]]);
}
}
result.push(page);
// now handle pages:
for (i=0; i<result.length; i++)
{
// sort y1, y2 in page:
result[i].y1.sortThis();
result[i].y2.sortThis();
// store result and delete not needed elements
result[i].y1.length =1;
result[i].y2[0] = result[i].y2[result[i].y2.length-1];
result[i].y2.length = 1;
}
// format for alert
/*string*/var o = "";
for (i=0; i<result.length;i++)
{
o+= "Seite: " + result[i].number + " y1: " + result[i].y1 + " y2: " + result[i].y2 + "\n";
}
alert(o);
return;
function Page(/*int*/number, /*float*/y1, /*float*/y2)
{
this.number = number;
this.y1 = y1;
this.y2 = y2;
}
}


Das sollte den Job erledigen.

Dieses Skript sortiert das Array nach Seitennummer, dann erzeugt es für jede Seite ein Seitenobjekt, sortiert die Y-Werte innerhalb der Seite, speichert den niedrigsten Y1-Wert und den höchsten Y2-Wert.
Zum Schluss gibt es eine Ergebnisliste aus.
Ich denke, das war es was Du wolltest.

Array.prototype.sortThis()
sortiert ein- und mehrdimensionale Arrays.
HTH

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen

mehrdimensionales Array reduzieren

da-tex
Beiträge gesamt: 67

3. Jul 2013, 07:16
Bewertung:

gelesen: 848

Beitrag als Lesezeichen
Hallo Herr Perplies,
vielen Dank für Ihre Bemühungen.
Wahrscheinlich war ich etwas unflexibel, was die Herangehensweise betraf ;)
Es funktioniert sehr gut.

Philipp

mehrdimensionales Array reduzieren

WernerPerplies
Beiträge gesamt: 2762

3. Jul 2013, 07:19
Bewertung:

gelesen: 846

Beitrag als Lesezeichen
Hallo Philipp,

Zitat vielen Dank für Ihre Bemühungen.


Zitat Wahrscheinlich war ich etwas unflexibel, was die Herangehensweise betraf ;)

Wie drückt sich das aus?

Einen schönen Tag wünscht

Werner Perplies
Praxisnahe Skript-Lösungen und Skript-Programmierung für Adobe InDesign
Aktuelles (Stand: 14.02.2024)
Kundenstimmen