shardas
Goto Top

Array.splice() funktioniert nicht

Liebe Javascript-Könner,

mit array.splice lassen sich Elemente komplett aus Arrays entfernen. Leider will das bei mir nicht wirklich:

content = object {name=test, value="testvalue"}
content[1] = object {name=test2, value="testvalue2"}
content[2] = object {name=test3, value=""}
usw.

Es gibt nun Objekte, dessen Value ein leerstring ist. Diese kann ich anhand

$.each(content, function(i, v) {
if (v.value === "") {
console.log(v);
}
});

identifizieren. console.log(v) zeigt mir genau die Objekte mit leeren Value String. Diese müssen nun dem Array entnommen werden.
Tausche ich console.log durch content.splice(i,1) aus erhalte ich im Log die Meldung:

TypeError: v is undefined
if (v.value === "") {

a20bd20b338ccfc71d252179a3b17d82

Ich bin in JS noch zu unerfahren um mit diesem Fehler umzugehen.
Hat jemand Lösungsansätze für mich?

Vielen Dank

Content-ID: 236235

Url: https://administrator.de/forum/array-splice-funktioniert-nicht-236235.html

Ausgedruckt am: 22.12.2024 um 17:12 Uhr

colinardo
colinardo 23.04.2014 aktualisiert um 18:39:07 Uhr
Goto Top
Hallo Shardas,
deine Objektdeklaration stimmt nicht so ganz, so sollte es funktionieren:
var content = new Array();
content = new Object({name:"test", value:"testvalue"});  
content[1] = new Object({name:"test2", value:"testvalue2"});  
content[2] = new Object({name:"test3", value:""});  
http://www.w3schools.com/js/js_objects.asp

Grüße Uwe
Shardas
Shardas 23.04.2014 aktualisiert um 13:58:08 Uhr
Goto Top
Hallo Uwe und danke für deine Hilfe,

ich muss etwas weiter ausholen. Das Array kommt nicht von mir, sondern von der funktion serializeArray(). Hintergrund ist ein Formular welches per serializeArray() in ein Array verwandelt wird:

var content = $("#Formular").serializeArray();

daher ist die Objektdeklaration korrekt.
Beispiel content ist das erste Formularfeld welches hier für die Anrede zuständig ist:
console.log(content) beinhaltet Object { name="salutation", value="Herr"}

Ziel: befindet sich in einem Objekt des Arrays eine Leerstring als value, muss dieses Objekt aus dem Array entfernt werden, damit es später nicht submitted wird. face-smile

VG
colinardo
colinardo 23.04.2014 aktualisiert um 18:40:33 Uhr
Goto Top
Ah OK, dann hast du sehr wahrscheinlich Felder oder Formularelemente in deinem Formular bei dem das Attribut value fehlt und deshalb eine Exception ausgeworfen wird. Also entweder filterst du deine Elemente welche du mit Serialize in das Array beförderst und bei denen du weißt das ein value-Attribut vorhanden ist
var content = $('#testform input').serializeArray();
oder du prüfst zusätzlich ob die Value-Eigenschaft überhaupt vorhanden ist.

Grüße Uwe
Shardas
Shardas 23.04.2014 um 16:48:38 Uhr
Goto Top
Mensch, so leicht kanns sein. Einfach mit der IF-Abfrage "undefined" vorher abfangen face-smile
Das klappt recht gut.

Allerdings:
In dem Formular gibt es drei Passwort Felder (aktuelles, neues, und neues bestätigen). Interessanter weiße wird das zweite Feld nicht rausgefiltert, obwohl Value auch ein leerstring ist. Feld 1 und 3 werden entfernt. Dieses Feld unterscheidet sich bis auf den Namen in keinster weise zu den anderen Feldern.

<input type="password" name="actualPassw"> //wird entfernt wenn ohne Inhalt  
<input type="password" name="newPassw"> //wird nicht entfernt  
<input type="password" name="newPasswConf"> //wird entfernt  

Das ist doch nicht logisch?
colinardo
Lösung colinardo 23.04.2014, aktualisiert am 24.04.2014 um 00:16:45 Uhr
Goto Top
Zitat von @Shardas:
Das ist doch nicht logisch?
Doch, mir fällt gerade auf, in dem Script ist ein Designfehler! Denn es entfernt in der Schleife Elemente via Index, jedoch passt der Index nach dem Entfernen eines Elementes nicht mehr zum korrekten Element im content-Array, da dies dann schon ein Element kleiner ist.

Das kannst du so lösen, indem du einfach aus den Elementen die Inhalt haben ein neues Array baust:
var content = $('#testform').serializeArray();  
var newcontent = new Array();
$.each(content,function(i,v){
	if (v.value !== undefined && v.value !== ""){  
		newcontent.push(v);
	}
});
console.log(newcontent);
Shardas
Shardas 23.04.2014 um 20:24:02 Uhr
Goto Top
Mensch, Wahnsinn face-smile
Darauf bin ich nicht gekommen. Bei PHP wird der Index nicht neu geschrieben wenn ein Element entfernt wird.

Danke, das war die Lösung!