2017-04-30 9 views
0

Hier Entfernen ist mein Code:"Objekt mit einem Array-Feld" aus einem Array in Javascript

var subMed = [ {med:'bm', sub:[ 'a' , 'b' ]} , {med:'bm', sub:[ 'c' , 'd' , 'e' ]} ]; 
    var sal = [ {num:"1",amount:"500"} ]; 
    var t = {Class:"1", subMeds:subMed, numOfSub:2, sals:sal }; 
    var infoAcademic = []; 
    infoAcademic.push(t); 

    subMed = [ {med:'em', sub:[ 'p']} , {med:'bm', sub:[ 'r' , 's' ]} ]; 
    sal = [ {num:"2",amount:"1500"},{num:"1",amount:"700"} ]; 
    t = {Class:"1", subMeds:subMed, numOfSub:1, sals:sal }; 
    infoAcademic.push(t); 

    var tempObj = infoAcademic[1]; // an object 
    var mediumSubjects = tempObj["subMeds"]; // an array 

    console.log(mediumSubjects); 

    for(i=0;i<mediumSubjects.length;i++){ 
     var temp = {}; // object 
     temp = mediumSubjects[i]; 
     if(temp["med"] == 'bm'){ 

      tempObj["numOfSub"] = tempObj["numOfSub"] - temp["sub"].length; 
      var salArr = tempObj["sals"]; // array 
      var j = salArr.length; 
      if(salArr.length > 0){ 
       while(j--){ 
        var salObj = salArr[j]; // object 
        var howManySub = salObj["num"]; 
        if(howManySub > tempObj["numOfSub"]){ 
         salArr.splice(j,1); 
        } 
       } 
      } 


      console.log("removing from the medSubjects list: "); 
      console.log(temp); 
      var removed = mediumSubjects.splice(i, 1); 
      break; 
     } 
    } 

    console.log("removed element: "); 
    console.log(removed); 
    console.log(mediumSubjects); 

Wenn ich diesen Code dies einer Editor js Online schreiben https://js.do/, gibt den Code Ergebnis wie pro erwartet. Aber wenn ich diesen Code in eine onclick-Funktion meiner JSP-Seite einbinde, wird kein Element aus dem Array mediumSubjects entfernt. Das entfernte Element zeigt leer.

Jedoch wenn ich diesen Teil auf Kommentar:

tempObj["numOfSubj"] = tempObj["numOfSub"] - temp["sub"].length; 
var salArr = tempObj["sals"]; // array 
var j = salArr.length; 
if(salArr.length > 0){ 
    while(j--){ 
      var salObj = salArr[j]; // object 
      var howManySub = salObj["num"]; 
      if(howManySub > tempObj["numOfSub"]){ 
       salArr.splice(j,1); 
      } 
    } 
} 

der Code verhält sich überraschenderweise als Expected sie das Element aus dem Array entfernt mediumSubjects.

Gibt es ein Synchronisierungsproblem oder etwas anderes? Warum so ein ungewöhnliches Verhalten?

N.B. Ich muss Elemente aus dem Array entfernen mediumSubjects, so delete wird hier nicht funktionieren.

+0

Was ist das Problem, vor dem Sie stehen? Haben Sie ein größeres Array als im Beispiel gezeigt? –

+0

Der von Ihnen gepostete Code funktioniert. Nach dem Ausführen hat 'medSub' nur ein Objektelement. Der Konsolenbefehl gibt auch 'removed element: [object Object]' aus (nicht leer wie es in Ihrer Frage steht) – jrook

+0

Ja @PankajShukla –

Antwort

0

Alles, was Sie tatsächlich brauchen, ist über das äußere Array zu iterieren und im Körper dieser Schleife müssen Sie über die Objektschlüssel iterieren.

für Beispiel:

// removing med key from the array. 
medSub.forEach(obj => { 
    for (let key in obj) { 
     if (key === 'med' && obj[key] === 'em') { 
     delete obj[key]; 
     } 
    } 
}); 

Ich hoffe, das hilft.

+0

Ich muss das Element aus dem Array entfernen. "delete" setzt ein undefined an die Stelle des Elements. –

1

Versuchen Sie, diese Variante:

var newMedSub = medSub.filter(function(elem) { 
    return elem.med !== 'em'; 
}); 

Es wird Ihnen helfen, ein neues Array ohne unnessessary Objekt zu erhalten.

Verwandte Themen