Ergebnis 1 bis 14 von 14
  1. #1
    mess ist offline Jungspund
    registriert
    26-06-2009
    Beiträge
    16

    String Array auswerten

    Folgendes Problem:

    ich möchte ein String-Array auswerten, wobei dieses Array gleiche und unterschiedliche Strings enthalten kann. Die Werte dieses Arrays werden zur Laufzeit des Skripts per AJAX aus einer Datenbank geholt. Ich möchte wissen, wie viele unterschiedliche Strings dort enthalten sind.

    Zweitens: Nur die jeweils unterschliedlichen Werte sollen gespeichert werden (z.B. in einem neuen Array). In das neue Array soll ein Wert aus dem alten Array nur dann übertragen werden, wenn er dort noch nicht vorhanden ist. (Groß-u. Kleinschreibung mal außer Acht gelassen.)

    Anderswo gibt es für solche Zwecke Collections (zB Hashmap) oder Funktionen(array_count_values()), in Javascript sieht es da etwas mau aus. Aber im Prinzip müsste man ja auch alles mit Schleifen und Fallunterscheidungen auf die Reihe kriegen...

  2. #2
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: String Array auswerten

    Zitat Zitat von mess Beitrag anzeigen
    Aber im Prinzip müsste man ja auch alles mit Schleifen und Fallunterscheidungen auf die Reihe kriegen...
    Genau. Und wie lautet jetzt deine Frage?

  3. #3
    mess ist offline Jungspund
    registriert
    26-06-2009
    Beiträge
    16

    AW: String Array auswerten

    Mit fällt einfach keine Lösung ein - ich bräuchte mal eine Anregung.
    Momentan bin ich soweit (s.u.). Eigentlich sollte nur dann ein neuer Wert
    in newArr geschrieben werden, wenn der dort noch nicht vorhanden ist - fkt nur leider nicht. Und newArr wird jedesmal größer - scheint ein Problem für die Abbruchbed im Schleifenkopf zu sein. Jedenfalls ist der Firefox noch nie so oft in die Knie gegangen. Auch das Debugging mit Firebug hat mir keine Anregung gebracht. Habe das Gefühl, dass ich total auf dem falschen Weg bin.

    Code:
    alert("oldArr:"+resArr.length+"\nnewArr:"+newArr);					
    for (var j = 0; j < oldArr.length; j++)
    {				
    	if(!newArr[0])
    		newArr.push(oldArr[j]);
    	else
    	{
    		for(var n = 0; n < newArr.length; n++)
    		{							
    			if(!(oldArr[j] == newArr[n]))
    				oldArr.push(resArr[j]);
    		}
    	}
    }						
    alert("newArr: "+newArr.length);
    Wenn oldArray zB als Werte "Dienstag", "Theater", "Theater", "Dienstag", "Dienstag" hat, sollte newArr nur die Werte "Dienstag", "Theater" enthalten. Falls jemand spontan einen konstruktiven Tipp parat hat oder schon mal ein ähnliches Problem gelöst hat, wäre ich sehr dankbar.

  4. #4
    Juppiduh ist offline Doppel-As
    registriert
    17-06-2009
    Beiträge
    143

    AW: String Array auswerten

    Wieso arbeitest Du mit 3 arrays und warum pushst Du oldArr?

    Der Hauptfehler liegt bei Dir darin, daß Du push() in der inneren Schleife anwendest. Das gehört in die äußere Schleife - zum Beispiel so:
    PHP-Code:
    <script type="text/javascript">
    var 
    arr=['blah blah','blaH','bLah BLAH','blaah','BlaH','blaH'];
    function 
    unique(arr,ic){
        var 
    retArr=[],tmp,tmp2,inArr;
        for(var 
    i=0;i<arr.length;i++){
            
    tmp=ic?arr[i].toLowerCase():arr[i];
            
    inArr=false;
            for(var 
    j=0;j<retArr.length;j++){
                
    tmp2=ic?retArr[j].toLowerCase():retArr[j];
                if(
    tmp2==tmp)inArr=true;
            }
        if(!
    inArr)retArr.push(arr[i]);
        }
        return 
    retArr;
    }
    alert(unique(arr));
    alert(unique(arr,1));//Groß-/ Kleinschreibung beim Vergleich ignorieren
    </script> 

  5. #5
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: String Array auswerten

    und weil du Hashmaps genannt hast, diese gibt es auch in JS. Eine etwas elegantere Lösung über die Erweiterung des Array Objektes sähe z.b. so aus:
    PHP-Code:
    Array.prototype.unique = function() {
        var 
    tmp = {};
        for(var 
    0;this.length;i++) tmp[this[i]] = true;
        var 
    ret = [];
        for(var 
    a in tmpret.push(a);
        return 
    ret;
        
    };
    var 
    oldArray = ["Dienstag""Theater""Theater""Dienstag""Dienstag"];
    alertoldArray.unique().join('\n')) 

  6. #6
    mess ist offline Jungspund
    registriert
    26-06-2009
    Beiträge
    16

    AW: String Array auswerten

    Danke für die konstruktiven Anregungen!

    @Juppiduh
    Das mit den 3 Arrays war schlichtweg verschrieben (resArr = oldArr). Die falsche Position von push() - das war's tatsächlich! - dein ansatz erklärt die absurden Elementanzahl in meinem newArray... danke nochmal!

    @ein schlauer
    DAS ist wirklich eine elegante Lösung ... bin beeindruckt. Hatte vorher nur gelesen, dass man so etwas wie ein ass.Array über eine Erweiterung von Object erreichen könnte, also quasi als Array von Objects ... das prototypen-Konzept muss ich mir mal genauer ansehen. Arbeite sonst noch mit selfhtml, die scheint mir, was JS angeht, bei Version 1.2 stehengeblieben zu sein ...

  7. #7
    mess ist offline Jungspund
    registriert
    26-06-2009
    Beiträge
    16

    AW: String Array auswerten

    nun hab' ich mich nochmal rangesetzt, um das ganze zu verfeinern. jetzt sollen also nicht nur unique-Einträge erfasst werden, sondern es soll auch gezählt werden, wie oft ein Eintrag im alten Array enthalten ist. aus einem "normalen Array" wird ein 2d-Array gemacht - so jedenfalls der plan. funktioniert bloß nicht:
    PHP-Code:
    function unique2(arrayIn)
    {
      var 
    arrayOut=[],exis=false,zeichen="",anzahl=0;
      for(var 
    i=0;i<arrayIn.length;i++)
        {
            for(var 
    j=0;j<arrayOut.length;j++)
            {            
                if(
    zeichen==arrayIn[i])
                {
                    
    exis=true;
                    ++
    anzahl;
                }
                else
                    
    zeichen=arrayIn[i];            
        }
            if(!
    exis)
            {
                
    arrayOut[arrayOut.length]=new Array(2);
                
    arrayOut[j][0]=anzahl;
                
    arrayOut[j][1]=zeichen;
            }
      }
      return 
    arrayOut;
    }

    var 
    a=["a","a","b","a","b"];
    var 
    n=unique2(a);
    alert("array alt:\t\t"+a+"(länge a: "+a.length+")\narray neu:\t"+n+"(länge n:"+n.length+")"); 
    aus Array a ["a","a","b","a","b"] sollte Array-Array b [[3,"a"],[2,"b"]] werden.
    Leider haut das momentan nicht so recht hin - Resultat: [[0,""],[0,"a"]].
    Die Zeilenanzahl scheint zu stimmen, die einzelnen werten nicht. Irgendjemand eine Idee, warum das nicht will?

  8. #8
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: String Array auswerten

    Dazu kannst du ohne Probleme meinen Vorschlag erweitern:
    PHP-Code:
    Array.prototype.unique = function() {
        var 
    tmp = {};
        for(var 
    0this.lengthi++) tmp[this[i]] = typeof tmp[this[i]] == 'undefined'tmp[this[i]] + 1;
        var 
    ret = [];
        for(var 
    a in tmpret.push([tmp[a],a]);
        return 
    ret;
        
    };
    var 
    oldArray = ["Dienstag""Theater""Theater""Dienstag""Dienstag"];
    alertoldArray.unique().join('\n')) 
    EDIT: Danke, kkapsner
    Geändert von ein schlauer (17-08-2009 um 01:15 Uhr)

  9. #9
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.672

    AW: String Array auswerten

    Die Logik deiner Funktion bleibt mir leider verborgen:
    Code:
    function unique2(arrayIn){
    	var arrayOut=[],exis=false,zeichen="",anzahl=0;
    	for(var i=0;i<arrayIn.length;i++){
    		zeichen = arrayIn[i];
    		exis = false;
    		for(var j=0;j<arrayOut.length;j++){            
    			if (zeichen == arrayOut[j][1]){
    				exis=true;
    				arrayOut[j][0]++;
    				break;
    			}           
    		}
    		if(!exis){
    			arrayOut.push(new Array(1, zeichen));
    		}
    	}
    	return arrayOut;
    }
    Ich würde aber mit einem Object arbeiten:
    Code:
    function unique2(arrayIn){
    	var arrayOut={};
    	for(var i=0;i<arrayIn.length;i++){
    		if (arrayOut[arrayIn[i]]) arrayOut[arrayIn[i]]++;
    		else arrayOut[arrayIn[i]] = 1;
    	}
    	return arrayOut;
    }
    EDIT: @ein schlauer: du musst mit 1 initialisieren, sonst zählst du das erste Vorkommen nicht mit.
    Geändert von kkapsner (17-08-2009 um 01:12 Uhr)

  10. #10
    mess ist offline Jungspund
    registriert
    26-06-2009
    Beiträge
    16

    AW: String Array auswerten

    @kkapsner
    es sollte eine art ergebnistabelle werden, eine erweiterung von dem, was Juppiduh mal ins spiel gebracht hatte. die funktionalität meiner funktion blieb mir leider selbst verborgen
    ich kann deinem vorschlag allerdings auch net so recht folgen. sollen das jeweils objekteigenschaften darstellen, etwa so:
    Code:
    arrayout={char1:anzahl1,char2:anzahl2,...usw}
    oder eher als objekte-objekt:
    Code:
    arrayout={{char1:anzahl1},{char2:anzahl2},...usw}
    @ein schlauer
    auf was genau bezieht sich eigentlich:
    Code:
    tmp[this[i]]
    ist das der jeweilige Eintrag des Arrays? ist das tmp-objekt jetzt auch ein objekt nach dem muster
    Code:
    tmp={char1:anzahl1}
    ?

    btw:
    gibt es bei javascript so etwas wie var_dump oder print_r?
    Geändert von mess (17-08-2009 um 08:53 Uhr)

  11. #11
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: String Array auswerten

    Zitat Zitat von mess Beitrag anzeigen
    @ein schlauer
    auf was genau bezieht sich eigentlich:
    Code:
    tmp[this[i]]
    ist das der jeweilige Eintrag des Arrays? ist das tmp-objekt jetzt auch ein objekt nach dem muster
    Code:
    tmp={char1:anzahl1}
    ?
    tmp ist ein Objekt und wird hier als Hashmap benutzt. D.h. für jeden Eintrag des Arrays (this) wird ein Schlüssel erzeugt und der Schlüssel wird bei jeden Eintrag hochgezählt.

    Zitat Zitat von mess Beitrag anzeigen
    btw:
    gibt es bei javascript so etwas wie var_dump oder print_r?
    Nein.

  12. #12
    mess ist offline Jungspund
    registriert
    26-06-2009
    Beiträge
    16

    AW: String Array auswerten

    danke für die erklärungen!

    wenn ichs richtig verstanden habe, also eher sowas
    Code:
    tmp={anzahl1:zeichen1}
    dann ist der integer der schlüssel? und int-schlüssel kann man hochzählen? kriegt das tmp-Objekt jedesmal, wenn das zeichen gefunden wurde, einen neuen schlüssel?

  13. #13
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: String Array auswerten

    Nein, tmp ist eher sowas:
    PHP-Code:
    tmp = {
    schlüssel1:anzahl1,
    schlüssel2:anzahl2,
    schlüssel3:anzahl3,
    usw

    Der Schlüssel, ist der Schlüssel (ich ging davon aus, dass du weißt was eine Hashmap ist, du hattest den Begriff verwendet)

  14. #14
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.672

    AW: String Array auswerten

    Zitat Zitat von mess Beitrag anzeigen
    ich kann deinem vorschlag allerdings auch net so recht folgen. sollen das jeweils objekteigenschaften darstellen, etwa so:
    Code:
    arrayout={char1:anzahl1,char2:anzahl2,...usw}
    - ja

Ähnliche Themen

  1. Bilder in String finden / match -> Array
    Von trice22 im Forum JavaScript
    Antworten: 3
    Letzter Beitrag: 04-12-2007, 17:30
  2. Antworten: 8
    Letzter Beitrag: 16-02-2007, 01:12
  3. Antworten: 3
    Letzter Beitrag: 21-11-2005, 11:15
  4. Antworten: 5
    Letzter Beitrag: 18-08-2005, 14:10
  5. string array sortieren
    Von Spezialist im Forum JavaScript
    Antworten: 2
    Letzter Beitrag: 14-11-2004, 12:22

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •