Arrayteil löschen
lima-city → Forum → Die eigene Homepage → HTML, CSS & Javascript
anzahl
apfelsaft
array
ausgabe
ausgeben
code
einkauf
eintrag
element
entfernen
essen
funktion
grad
item
krieg
problem
stelle
trinken
url
versuch
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo nicole,
schau doch mal hier
http://www.constructors.de/array-prototype-beliebiges-element-eines-arrays-loeschen-4-2.html -
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. -
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 -
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... -
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 -
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 -
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>Σ</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 -
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
eigentlich nicht vorgesehen ist (laut ECMAScript Spez. wegen der -2) und vom IE 7 nichtretVal.substr (-2)
interpretiert wird. Um sicher zu gehen, dass für IE-Kunden nicht alles treurer wird wäre hier wohl
zu verwenden ;).retVal.substr (retVal.length - 2)
FF interpretiert die Anagabe natürlich wie erwartet.
Gruß
Manni
Beitrag zuletzt geändert: 23.8.2009 11:42:51 von bandi999 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage