2015-11-02 11 views
9

Ich möchte das aktuelle Objekt für jede Schleife ändern und es funktioniert nicht, warum es nicht funktioniert und wie kann ich das tun?Js ändern Objekt in Array innerhalb für jede Schleife

var arr = [{num: 1}, {num: 2}]; 

arr.forEach(function(item) { 
    item = {somethingElse: 1} 
}); 

console.log(arr); 
+0

Ich glaube, du meinst Karte? 'arr.map (Funktion (Element) {return {somethingElse: 1}});' – Ziki

Antwort

22

Es funktioniert nicht, weil alles, was Sie tun, um den Wert des Arguments ist die Aktualisierung Sie (item) gegeben wurden, die nicht eine Live-Verbindung zum Array hat. Diese Änderung verschwindet, sobald der Rückruf zurückkehrt.

Die am besten geeignete Weg, dies zu tun, ist map zu verwenden:

var arr = [{num: 1}, {num: 2}]; 

arr = arr.map(function(item) { 
    return {somethingElse: 1}; 
}); 

console.log(arr); 

map gibt Ihre Funktion jedes Element und baut eine neue Array aus, was auch immer Sie zurückkommen.

Wenn es wichtig ist, dass Sie das Array an Ort und Stelle zu aktualisieren, statt einen neuen zu bauen, Sie können verwenden forEach, man muss nur auf das Array-Element zuweisen zurück Sie aktualisieren. Das zweite Argument für forEach ‚s Rückruf ist der Index die Sie gerade besuchen, so:

var arr = [{num: 1}, {num: 2}]; 

arr.forEach(function(item, index) { 
    arr[index] = {somethingElse: 1}; 
}); 

console.log(arr); 

Natürlich oben in beiden Fällen würden Sie tatsächlich item für etwas verwenden, die Sie aren‘ t in Ihrem Beispielcode ... Wenn Sie Eigenschaften auf item hinzufügen/entfernen möchten, ersetzen Sie das Objekt nicht vollständig, Cyril's answer zeigt Ihnen, wie Sie das tun.

+0

@epascarello: Danke, behoben. –

1

Sie ändern die lokale Referenz item in der Callback-Funktion.

Um Array-Inhalt zu ändern, müssen Sie den Array-Index verwenden und neue Referenz zuweisen, wie weiter unten

arr.forEach(function(item, i) { 
    arr[i] = {somethingElse: 1} //using index, change the reference in array 
}); 
0

Sie auf dem Objekt nicht berufstätig sind in gezeigt, so Änderungen nicht übertragen werden.

Sie können dies stattdessen tun:

arr.forEach(function(item, ind, array) { 
    array[ind] = {somethingElse: 1} 
}); 
4

Eine weitere Spielart der Liste der Antworten

var arr = [{num: 1}, {num: 2}]; 

arr.forEach(function(item) { 
    item.something = 2;//setting the value 
    delete item.num;//deleting the num from the object 
}); 
+1

Ja, das ist die andere Möglichkeit: Das Objekt mutieren. –

Verwandte Themen