Array sortieren
Bernhard
- javascript
0 Daniel Thoma0 Bernhard0 Daniel Thoma0 Bernhard0 Daniel Thoma0 Bernhard
Hallo zusammen,
suche eine Möglichkeit ein Array nach doppelten Werten zu durchsuchen und die Doppelte Werte auszugeben, selber habe ich in dieser Richtung schon gebastelt, mit zwei Funktionen, ohne Erfolg :-(
Mein Code:
...
function text_order(tObj, nObj)
{
var v_aus = "", k=0, b=0, i=1, g=0;
var v_vor = new Array(), v_tvar = new Array(), v_ovar = new Array();
for(var t=0; t<=nObj.length; t++)
{
if(nObj[t] != undefined)
{
v_ovar[t] = nObj[t];
}
}
for(var t=0; t<=tObj.length; t++)
{
if(tObj[t] != undefined)
{
v_tvar[t] = new Array();
v_tvar[t][1] = tObj[t];
}
}
v_tvar.sort();
do{
k++;
if(v_tvar[b] == v_tvar[k])
{
for(g=1; g < v_ovar.length; g++)
{
if(v_tvar[b] == v_ovar[g][1])
{
v_vor[g] = "2: "+v_ovar[g][2]+", 1: "+v_ovar[g][1]+", 3: "+v_ovar[g][3]+"\n";
}
}
}
b++;
}while(b < (v_ovar.length));
return v_vor;
}
function zustand_box()
{
reg_n = /[1]/;
var alle="", i=0, k=0, j=0, l=0, jk="";
var a_wert = new Array(); // Steht für 'alle Werte'.
var v_t = new Array(), v_b = new Array();
for (var i=0; i< document.form1.elements.length; i++)
{
k=i;
k+=1;
if(reg_n.exec(form1[i].name) && form1[i].value != 'Starten')
{
if(document.form1.elements[i].checked == true)
{
a_wert[i] = new Array();
a_wert[i][1] = document.form1.elements[i].value;
a_wert[i][2] = document.form1.elements[k].value;
}
}
}
for(var tf in a_wert)
{
v_t[tf] = a_wert[tf][1];
v_b[tf] = a_wert[tf][2];
}
jk += text_order(v_b, v_t);
if(jk)
{
alert(jk);
return true;
}
else
{
return false;
}
}
...
Die erste Funktion sammelt die Werde aus dem Formular, die zweite soll sie auswerten, leider tut sie das nicht und ich weiß nicht recht warum ? Kann mir jemand in dieser Sache weiter helfen ? Ein Vorschlag mit eine Variable, oder nur eine Funktion.
Danke im Voraus.
Grüße Bernhard.
box_. ↩︎
Hallo
suche eine Möglichkeit ein Array nach doppelten Werten zu durchsuchen und die Doppelte Werte auszugeben.
Deine Funktionen scheinen mir doch reichlich kompliziert für diese Aufgabe. Ich habe mal kurz eine andere Funktion geschrieben und mit Opera, Mozilla und Netscape 4 getestet.
function getDuplicates(list) {
var elements = new Array();
var ret = new Array();
for(var a = 0; a < list.length; a++) {
if(!elements[list[a]]) {
elements[list[a]] = 1;
}
else if(elements[list[a]] == 1) {
elements[list[a]] = 2;
ret.push(list[a]);
}
}
return ret;
}
Grüße
Daniel
Hallo,
danke für die Antwort, Deinen Funktion kann ich leider noch nicht so richtig nachvollziehen.
In der For Schleife die If Abfrage, ist nicht in dem Element des 'Objekts' 'list' an der Position 'a' setzte das 'Element' na der Position 'a' gleich einst, ansonsten entspricht das Element des 'Objekts' 'list' an der Position 'a' '==' einst setze das Element an der Position 'a' gleich zwei, erster Ausdruck. Im zweitem Ausdruck füge das Element 'list' an der Position 'a' dem Array 'ret' hinzu.
Verstehe ich den Vorgang richtig, falls nicht bitte korrigiere mich, ich würde gerne die Funktion auch verstehen bevor ich sie einfach nur abschreibe.
Noch Mal danke für die Funktion ;-)
function getDuplicates(list) {
var elements = new Array();
var ret = new Array();
for(var a = 0; a < list.length; a++) {
if(!elements[list[a]]) {
elements[list[a]] = 1;
}
else if(elements[list[a]] == 1) {
elements[list[a]] = 2;
ret.push(list[a]);
}
}
return ret;
}
In der Zwischwnzeit habe ich mir auch etwas gepastelt:
function text_order(nObj, tObj)
{
var v_aus = "", k=0, b=0, i=1, g=0, h=0, f=0;
var v_vor = new Array();
tObj.sort();
do{
if(tObj[b] != undefined)
{
k++;
if(tObj[b] == tObj[k])
{
for(g=0; g < nObj.length; g++)
{
if(nObj[g] != undefined)
{
if(tObj[b] == nObj[g][1])
{
v_aus += nObj[g][3]+", "+nObj[g][1]+", "+nObj[g][2]+"\n";
}
}
}
}
}
}while(++b < (tObj.length-1));
return v_aus;
}
Grüße Bernhard
Hallo Bernhard
Der Array elements wird hier als assoziativer Array verwendet.
Die einzelnen Werte werden also nicht über Nummern, sondern über beliebige Schlüssel angesprochen.
function getDuplicates(list) {
var elements = new Array();
var ret = new Array();
for(var a = 0; a < list.length; a++) { //Für alle übergebenen Elemente:
if(!elements[list[a]]) { //Wenn der Array elements das Element nicht als Schlüssel enthält,
elements[list[a]] = 1; //Füge es hinzu und setze den Wert auf 1.
}
else if(elements[list[a]] == 1) { //Wenn dem Element der Wert 1 zugeordnet ist,
elements[list[a]] = 2; //setze den Wert auf 2
ret.push(list[a]); //und füge das Element der Ergebnisliste hinzu.
}
}
return ret;
}
Grüße
Daniel
Hallo Daniel,
Danke für die Korrektur. Die If Abfrage ist mir noch unklar, leider hatte ich bis jetzt nicht viel mit assoziativen Arrays gearbeitet, jetzt zum Code:
if(!elements[list[a]]) { //Wenn der Array elements das Element nicht als Schlüssel enthält, <---- ?
elements[list[a]] = 1; //Füge es hinzu und setze den Wert auf 1. <---- ?
}
else if(elements[list[a]] == 1) { //Wenn dem Element der Wert 1 zugeordnet ist,
elements[list[a]] = 2; //setze den Wert auf 2
ret.push(list[a]); //und füge das Element der Ergebnisliste hinzu.
}
"Wenn der Array elements das Element nicht als Schlüssel enthält" bedeutet das, ist das Element im Array nicht vorhanden dann füge es hinzu und setzt auf 1?
Bsp. wenn ich in einem Formular 10 Elemente habe, Begin mit TEXT0 bis TEXT9 (TEXT4 kommt 2 Mal vor im Abstand von 3 Elementen) und jetzt möchte ich es wissen ob ein Element sich wiederholt und wie oft sich der Element wiederholt, also wird in der If Abfrage geprüft, Begin mit dem ersten Element, ist der TEXT0 als Schlösserwert im Array elements enthalten dann füge es hinzu und setze sein Wert auf 1, verstehe ich das richtig? Falls ja hat der TEXT0 jetzt den Wert 1, das gleiche gescheit mit den weitern Elementen bis wir das Element TEXT4 treffen, die gleiche Prozedur findet wider statt, TEXT4 hat jetzt den Wert 1, der Ablauf geht weiter bis der zweite Element TEXT4 gefunden wird, das Element ist schon als Schlüssel enthalten also wird also wird der zweite Teil der If Abfrage aktiv? An dieser Stelle kommt mir ein Frage auf, woher weist die If Abfrage der der Element TEXT4 schon da war?
Ist das was ich oben geschrieben habe, das was man unter assoziativen Array Verwendung versteht OK? falls nicht, kannst Du bitte mich wider korrigieren.
Vielen Dank.
Grüße Bernhard
Hallo Bernhard
Danke für die Korrektur. Die If Abfrage ist mir noch unklar, leider hatte ich bis jetzt nicht viel mit assoziativen Arrays gearbeitet.
Erst mal ein kleines Beispiel eines assoziativen Arrays:
var a = new Array();
a["key"] = "value";
if(!elements[list[a]]) { //Wenn der Array elements das Element nicht als Schlüssel enthält, <---- ?
elements[list[a]] = 1; //Füge es hinzu und setze den Wert auf 1. <---- ?
}
else if(elements[list[a]] == 1) { //Wenn dem Element der Wert 1 zugeordnet ist,
elements[list[a]] = 2; //setze den Wert auf 2
ret.push(list[a]); //und füge das Element der Ergebnisliste hinzu.
}
"Wenn der Array elements das Element nicht als Schlüssel enthält" bedeutet das, ist das Element im Array nicht vorhanden dann füge es hinzu und setzt auf 1?
Ja.
Bsp. wenn ich in einem Formular 10 Elemente habe, Begin mit TEXT0 bis TEXT9 (TEXT4 kommt 2 Mal vor im Abstand von 3 Elementen) und jetzt möchte ich es wissen ob ein Element sich wiederholt und wie oft sich der Element wiederholt, also wird in der If Abfrage geprüft, Begin mit dem ersten Element, ist der TEXT0 als Schlösserwert im Array elements nicht enthalten dann füge es hinzu und setze sein Wert auf 1, verstehe ich das richtig?
Ja.
»»Falls ja hat der TEXT0 jetzt den Wert 1, das gleiche gescheit mit den weitern Elementen bis wir das Element TEXT4 treffen, die gleiche Prozedur findet wider statt, TEXT4 hat jetzt den Wert 1, der Ablauf geht weiter bis der zweite Element TEXT4 gefunden wird, das Element ist schon als Schlüssel enthalten also wird also wird der zweite Teil der If Abfrage aktiv?
Auch richtig.
»»An dieser Stelle kommt mir ein Frage auf, woher weist die If Abfrage der der Element TEXT4 schon da war?
In der if-schleife wird der Wert abgefragt, der für das Element im Array elements steht.
Ist das Element noch nicht aufgetaucht, gibt es gar keinen Eintrag, der Rückgabewert ist also undefined, was in einer if-Frage wie ein Rückgabewert false behandelt wird.
Kam das Element schon einmal vor, ist der Wert 1 (oder 2), was in der if-Schleife wie ein Wert true behandelt wird.
Das liegt an der automatischen Typenumwandlung von JavaScript.
Da ein boolscher Typ (true/false) erwartet wird, wandelt Javascript den gefundenen Wert in true oder false um.
0, undefined und "" (der leere String) werden zu false.
Alles andere wird zu true.
Grüße
Daniel
Hallo Daniel,
herzlichen Dank für Deine ausführliche Erklärung des Vorgang, es hat mir sehr geholfen die Vorgänge in der If Abfrage zu verstehen.
Grüße Bernhard