for (let k in obj_copy)
{
Przychodzisz z C++/C#? Zwykle programiści w JS stawiają klamerki w tej samej liniii
for (let k in obj_copy) {
Tak się przyjęło po prostu. Chociaż działa tak i tak.
let obj_copy = obj;
w JS obiekty są kopiowane przez referencje, czyli tym sposobem nie kopiujesz obiektu, a jedynie robisz nowy "alias" do niego.
Jak chcesz działać na kopii, to potrzebujesz ją sam sobie zrobić. Możesz zrobić płytką kopię:
let obj_copy = {...obj};
// albo
let obj_copy = Object.assign({}, obj);
ale to ci nic nie da, bo chcesz zmienić głęboko właściwość [k].new
, więc potrzebujesz głębokiej kopii np.
let obj_copy = structuredClone(obj);
// albo
let obj_copy = JSON.parse(JSON.stringify(obj));
Przy czym oba sposoby nie zawsze ci zadziałają (np. te sposoby nie kopiują funkcji). Więc jeśli faktycznie istnieje potrzeba głębokiego klonowania, to można pomyśleć o jakimś customowym sposobie albo użyciu biblioteki (np. _.cloneDeep
z lodash, nie jestem zwolennikiem pakowania do każdej prostej rzeczy osobnej biblioteki, ale cóż, jest taki sposób. Chociaż myślę, że i tak warto się zastanowić "czy ja tego potrzebuję?". Przez większość czasu w JS wystarczy robienie płytkich kopii). Ew. w twoim przypadku powinno zadziałać:
let obj_copy = obj.map(item => ({...item}));
czyli ręczne zrobienie 2 poziomowej kopii.
BTW
for (let k in obj_copy)
for
/in
nie służy do tablic, tylko do iteracji po kluczach obiektów. Każda tablica to obiekt, więc działa, ale niech tylko w tablicy będzie jakaś customowa właściwość i już będzie problem, bo również zostanie przeiterowana. Lepiej użyć np. for...of
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of
zresztą pisałem ci już o tym w innym wątku.