kostenloser Webspace werbefrei: lima-city


Arrayteil löschen

lima-cityForumDie eigene HomepageHTML, CSS & Javascript

  1. Autor dieses Themas

    nicole

    nicole hat kostenlosen Webspace.

    Hallo!

    Ich grübel grade darüber, wie man aus einem Array ein Element entfernen kann.

    Mein Array und dessen Ausgabe:
    var shopliste = new Array;
    shopliste[0] = new Array ("Apfelsaft", "Trinken", 0, 6, 0);
    shopliste[1] = new Array ("Müsli", "Essen", 2, 0, 0);
    shopliste[2] = new Array ("Steak", "Essen", 10, 2, 0);
    shopliste[3] = new Array ("Wasser", "Trinken", 0, 8, 0);
    
    [...]
    
    einkauf.sort();
    einkaufausgabe = einkauf.join(", ");
    document.getElementById('einkaufsuebersicht').innerHTML = "Auf der Einkaufsliste: <b>" + einkaufausgabe + "</b><br />";

    So wirds ausgegeben, wenn beim einkaufsarray was dazu kommt (also man was aus shopliste wählt, wird es in das Array einkauf gepackt). Wenn ich nun aber einen Artikel wieder löschen will, muss der ja auch aus dem Array raus. Das mag grad nicht klappen und Google mag mir grad auch nicht mehr helfen! .__.

    Versuch der Ausgabe, bei Entfernung eines Elementes:
    [...]
    if (neuesItem == shopliste[i][0])
    	{
    	shopliste[i][4] -= 1;
    	einkauf = einkauf.splice(i, 1);
    	var essen = parseInt(shopliste[i][2]);
    	esswert -= essen;
    	var trinken = parseInt(shopliste[i][3]);
    	trinkwert -= trinken;
    	}
    }
    	einkauf.sort();
    	einkaufausgabe = einkauf.join(", ");
    	document.getElementById('einkaufsuebersicht').innerHTML = "Auf der Einkaufsliste: <b>" + einkaufausgabe + "</b>  TUTUTT<br />";

    Der splice()-Befehl wirkt aber irgendwie nicht. Bei dem code da gibt er mir sogar gar nichts mehr bei für "einkaufsausgabe" aus....

    Hoff, da kann mir wer n Tippp geben :)

    Liebe Grüße
    Nicole

    Beitrag zuletzt geändert: 21.8.2009 12:17:08 von nicole
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. c****s

    Nimm slice und net splice
    Wenn du das n-te Element löschen willst:
    myArr = myArr.slice (0, n).concat (myArr.slice (n + 1) );

    Oder so ähnlich, hab das nicht getestet.
  4. Autor dieses Themas

    nicole

    nicole hat kostenlosen Webspace.

    Hi!

    @ stay
    Habs leider damit nicht hinbekommen. Mit "einkauf.slice(i);" krieg ich nur den Wert an der Stelle i ausgegeben, aber ich will das aus dem Array ja löschen und alles andere ausgeben...

    @census
    Das geht gar nicht und ich versteh den Code auch nicht ^^"
  5. c****s

    nicole schrieb:
    Hi!

    @ stay
    Habs leider damit nicht hinbekommen. Mit "einkauf.slice(i);" krieg ich nur den Wert an der Stelle i ausgegeben, aber ich will das aus dem Array ja löschen und alles andere ausgeben...

    @census
    Das geht gar nicht und ich versteh den Code auch nicht ^^"


    Cool, dann hast du ein anderes Javascript als ich, denn folgende Seite funktioniert bei mir ohne Probleme:
    <html>
    	<head>
    		<script language="javascript">
    		var myArr = new Array ("eins", "zwei", "drei", "vier", "fuenf");
    		function doit ()
    		{
    			alert (myArr.join (", ") );
    			n = 2;			
    			myArr = myArr.slice (0, n).concat (myArr.slice (n + 1) ); 
    			alert (myArr.join (", ") );
    		}
    		</script>
    	</head>
    	<body>
    		<a href="javascript:doit()">Klick</a>
    	</body>
    </html>


    EDIT: Zur Erklärung.
    Am Anfang habe ich einen Array mit fünf Elementen und den lasse ich ausgeben. Dann benutze ich den Code von meinem letzten Post, um das n = 2te Element (da wir bei 0 das zählen anfangen, also den Eintrag "drei") zu löschen. Dann lass ich ihn erneut Ausgeben und voilà: "eins, zwei, vier, fuenf".

    Beitrag zuletzt geändert: 21.8.2009 19:08:09 von census
  6. Autor dieses Themas

    nicole

    nicole hat kostenlosen Webspace.

    Hm, nee irgendwie will es nicht. Das Problem war grade, dass es manchmal nicht ausschneidet und auch, wenn ich 3 Apfelsaft habe, er es ausschneidet, obwohl beim entfernen eines Objekts noch 2 da sind...

    //Einpackverwaltung
    var einkauf = new Array();
    //Shopdarstellung
    var shopliste = new Array;
    //Inhalte: 0:Name, 1:Art, 2:Esswert, 3:Trinkwert, 4:Anzahl, 5:Preis
    shopliste[0] = new Array ("Apfelsaft", "Trinken", 0, 6, 0, "1,23");
    shopliste[1] = new Array ("Müsli", "Essen", 2, 0, 0, "1,40");
    shopliste[2] = new Array ("Steak", "Essen", 10, 2, 0, "15,30");
    shopliste[3] = new Array ("Wasser", "Trinken", 0, 8, 0, 1.00);
    shopliste[4] = new Array ("Apfel", "Essen", 4, 1, 0, 0.40);
    shopliste[5] = new Array ("Kuchen", "Essen", 10, 4, 0, 10.00);
    shopliste[6] = new Array ("Wassermelone", "Essen", 2, 10, 0, 4.30);
    shopliste[5] = new Array ("Kaffee", "Trinken", 0, 2, 0, 3.49);
    shopliste[6] = new Array ("Sprudel", "Trinken", 0, 3, 0, 2.00);
    shopliste.sort();
    
    [...]
    
    function Itemweg(neuesItem)
    	{
    	//Anzahl und Trink- und Esswert dezimieren
    	for(var i = 0; i < shopliste.length; i++)
    		{
    		if (neuesItem == shopliste[i][0])
    			{
    			shopliste[i][4] -= 1;
    			var essen = parseInt(shopliste[i][2]);
    			esswert -= essen;
    			var trinken = parseInt(shopliste[i][3]);
    			trinkwert -= trinken;
    			}
    		 if (shopliste[i][4] == 1)
    		 	{
    			einkauf = einkauf.slice (0, i).concat (einkauf.slice (i + 1) );
    			}
    		}
    	document.getElementById('esswert').innerHTML = "Esswerte: " + esswert;
    	document.getElementById('trinkwert').innerHTML = "Trinkwerte: " + trinkwert;
    	document.getElementById('esswertfeld').value = esswert;
    	document.getElementById('trinkwertfeld').value = trinkwert;
    	//Ausgabe der Liste
    	einkauf.sort();
    	einkaufausgabe = einkauf.join(", ");
    	document.getElementById('ausgabe').innerHTML = "Auf der Einkaufsliste: <b>" + einkaufausgabe + "</b><br />";


    In "einkauf" sind nur die Namen der Items, die gekauft wurden. Ist ein Item schon gekauft, wird es nicht ein zweites mal eingefügt...
  7. c****s

    Naja, deine Funktion reduziert die Anzahl des Items, das als Parameter übergeben wurde. Danach überprüft es ob irgendein Item, sei es nun das vom Parameter oder nicht, genau einmal da ist, und falls es genau einmal da ist, schmeißt es den Eintrag aus dem Array weg. Das zweite IF muss ins erste IF mit rein.

    Ich nehme mal an, es soll den Eintrag genau dann löschen, wenn es keine items von dem Typ mehr gibt:

    Versuchs mal mit: (ungetestet):
    for(var i = 0; i < shopliste.length; i++)
    		if (neuesItem == shopliste[i][0])
    		{
    			shopliste[i][4] -= 1;
    			var essen = parseInt(shopliste[i][2]);
    			esswert -= essen;
    			var trinken = parseInt(shopliste[i][3]);
    			trinkwert -= trinken;
    			if (shopliste [i] [4] == 0)
    				einkauf = einkauf.slice (0, i).concat (einkauf.slice (i + 1) );
    		}


    Beitrag zuletzt geändert: 22.8.2009 20:33:46 von census
  8. Autor dieses Themas

    nicole

    nicole hat kostenlosen Webspace.

    Mensch! Ich hött nicht gedacht, dass es so schwer ist...

    Wenn ich nun "Apfel, Apfelsaft, Kaffee, Müsli, Sprudel, Steak, Wasser" einpacke, gibt er mir das aus.
    Will ich nun Apfel, Kaffee, Sprudel und Wasser löschen, gibt er mir "Apfelsaft, Kaffee, Sprudel, Steak" aus...
    Wenn ich nun alles von Wasser an abwähle, sagt er "" - gut!
    Lösche ich alles mit "Apfel" beginnend, gibt er mir "Apfelsaft, Müsli, Steak" aus.

    Kann es damit zusammenhängen in welcher Reihenfolge man es anwählt oder so? x___x
  9. c****s

    Hmm, es ist ein bisschen schwierig bei Fehlern zu helfen, wenn man immer nur minimale Codesnippets sieht, aber gut.
    Als erstes würde ich dir empfehlen dein Datenmodell ein bisschen abzuändern: Trenne statische von dynamischen Daten. Das macht die Verwaltung einfacher und falls du später mal alles in eine Datenbank schreiben willst, hast du gleich ein sauberes relationales Modell. Die Eigenschaften Name, Typ, Esswert, Trinkwert und Preis sind statisch. Egal, wieviele Produkte du kaufst oder auch nicht, diese Werte ändern sich nicht. Hingegen die Anzahl ist dynamisch, da sie ja eben den Einkauf beschreibt. Eine Möglichkeit, das ganze sauber zu trennen wäre folgendes:
    //Inhalte: 0:ID aus shopliste, 1:Anzahl
    var einkauf = new Array ();
    //Inhalte: 0:Name, 1:Art, 2:Esswert, 3:Trinkwert,5:Preis
    var shopliste = new Array ();
    shopliste[0] = new Array ("Apfelsaft", "Trinken", 0, 6, 1.2);

    Der Index der Shopliste dient als eindeutige ID für ein Produkt und wir im Array einkauf als "foreign key" genutzt. Dadurch ist das hinzufügen und entfernen von Produkten trivial:

    function addItem (id)
    			{
    				found = false;
    				for (i = 0; i < einkauf.length; i++)
    					if (einkauf [i] [0] == id)
    					{
    						einkauf [i] [1] ++;
    						found = true;
    						break;
    					}
    				if (! found)
    					einkauf.push (new Array (id, 1) );
    			}
    
    			function removeItem (id)
    			{
    				for (i = 0; i < einkauf.length; i++)
    					if (einkauf [i] [0] == id)
    					{
    						einkauf [i] [1] --;
    						if (einkauf [i] [1] == 0)
    							einkauf = einkauf.slice (0, i).concat (einkauf.slice (i + 1) );
    						break;
    					}
    			}


    Wenn man nun alles zusammenstöpselt, kommt ungefähr so etwas raus (getestet und funktioniert, zu sehen hier census.lima-city.de/shop falls der Webspace irgendwann wieder geht):
    <html>
    	<head>
    		<title>Census' shop</title>
    		<script language="javascript">
    			//Inhalte: 0:ID aus shopliste, 1:Anzahl
    			var einkauf = new Array ();
    			var shopliste = new Array ();
    			//Inhalte: 0:Name, 1:Art, 2:Esswert, 3:Trinkwert,5:Preis
    			shopliste[0] = new Array ("Apfelsaft", "Trinken", 0, 6, 1.2);
    			shopliste[1] = new Array ("Müsli", "Essen", 2, 0, 1.4);
    			shopliste[2] = new Array ("Steak", "Essen", 10, 2, 15.3);
    			shopliste[3] = new Array ("Wasser", "Trinken", 0, 8, 1.00);
    			shopliste[4] = new Array ("Apfel", "Essen", 4, 1, 0.4);
    			shopliste[5] = new Array ("Kuchen", "Essen", 10, 4, 10);
    			shopliste[6] = new Array ("Wassermelone", "Essen", 2, 10, 4.3);
    			shopliste[7] = new Array ("Kaffee", "Trinken", 0, 2, 3.49);
    			shopliste[8] = new Array ("Sprudel", "Trinken", 0, 3, 2);
    
    			function addItem (id)
    			{
    				found = false;
    				for (i = 0; i < einkauf.length; i++)
    					if (einkauf [i] [0] == id)
    					{
    						einkauf [i] [1] ++;
    						found = true;
    						break;
    					}
    				if (! found)
    					einkauf.push (new Array (id, 1) );
    				populateCart ();
    			}
    
    			function removeItem (id)
    			{
    				for (i = 0; i < einkauf.length; i++)
    					if (einkauf [i] [0] == id)
    					{
    						einkauf [i] [1] --;
    						if (einkauf [i] [1] == 0)
    							einkauf = einkauf.slice (0, i).concat (einkauf.slice (i + 1) );
    						break;
    					}
    				populateCart ();
    			}
    
    			function populateCart ()
    			{
    				sums = Array (0, 0, 0);
    				html = "<h2>Einkaufswagen</h2><table><tr><th>Produkt</th><th>Anzahl</th><th>Esswert</th><th>Trinkwert</th><th>Preis</th></tr>";
    				for (i = 0; i < einkauf.length; i ++)
    				{
    					html += "<tr><td>" + shopliste [einkauf [i] [0] ] [0] + "</td>"
    						+ "<td>" + einkauf [i] [1] + "</td>"
    						+ "<td>" + (einkauf [i] [1] * shopliste [einkauf [i] [0] ] [2] ) + "</td>"
    						+ "<td>" + (einkauf [i] [1] * shopliste [einkauf [i] [0] ] [3] ) + "</td>"
    						+ "<td>" + formatEuro (einkauf [i] [1] * shopliste [einkauf [i] [0] ] [4] ) + "</td>"
    						+ "</tr>";
    					sums [0] += einkauf [i] [1] * shopliste [einkauf [i] [0] ] [2];
    					sums [1] += einkauf [i] [1] * shopliste [einkauf [i] [0] ] [3];
    					sums [2] += einkauf [i] [1] * shopliste [einkauf [i] [0] ] [4];
    				}
    				html += "<tr><td>&Sigma;</td><td></td>"
    					+ "<td>" + sums [0] + "</td>"
    					+ "<td>" + sums [1] + "</td>"
    					+ "<td>" + formatEuro (sums [2] ) + "</td></tr>"
    					+ "</table>";
    				document.getElementById ("cart").innerHTML = html;
    			}
    
    			function populateShop ()
    			{
    				html = "<h2>Speisekarte</h2><table><tr><th>Produkt</th><th>Preis</th></tr>";
    				for (i = 0; i < shopliste.length; i ++)
    					html += "<tr><td>" + shopliste [i] [0] + "</td>"
    						+ "<td>" + formatEuro (shopliste [i] [4]) + "</td>"
    						+ "<td><a href=\"javascript:addItem(" + i + ")\">kaufen</a></td>"
    						+ "<td><a href=\"javascript:removeItem(" + i + ")\">entfernen</a></td></tr>";
    				html += "</table>";
    				document.getElementById ("shop").innerHTML = html;
    			}
    
    			function formatEuro (p)
    			{
    				retVal = String (Math.floor (p * 100) );
    				while (retVal.length < 3) retVal = "0" + retVal;
    				return retVal.substr (0, retVal.length - 2) + "," + retVal.substr (-2);
    			}
    		</script>
    	</head>
    	<body onload="javascript:populateShop()">
    		<div id="shop">
    			<h2>Shop</h2>
    		</div>
    		<div id="cart">
    			<h2>Cart</h2>
    		</div>
    	</body>
    </html>


    Beitrag zuletzt geändert: 23.8.2009 10:37:20 von census
  10. Hi,

    census hat mal wieder eine saubere Lösung erarbeitet :).

    Damit ich mich nun nicht ganz umsonst mit der Sache beschäftigt habe möchte ich noch anmerken, dass in der Funktion

    function formatEuro (p)
    {
    retVal = String (Math.floor (p * 100) );
    while (retVal.length < 3) retVal = "0" + retVal;
    return retVal.substr (0, retVal.length - 2) + "," + retVal.substr (-2);
    }

    der Ausdruck
    retVal.substr (-2)
    eigentlich nicht vorgesehen ist (laut ECMAScript Spez. wegen der -2) und vom IE 7 nicht
    interpretiert wird. Um sicher zu gehen, dass für IE-Kunden nicht alles treurer wird wäre hier wohl
    retVal.substr (retVal.length - 2)
    zu verwenden ;).

    FF interpretiert die Anagabe natürlich wie erwartet.

    Gruß
    Manni

    Beitrag zuletzt geändert: 23.8.2009 11:42:51 von bandi999
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!