Добавление нового элемента массива в json заменяет все элементы новым значением с помощью Typescript - PullRequest
0 голосов
/ 25 мая 2020

У меня есть вложенный файл json, который я пытаюсь изменить.

Basi c структура:

info: {...}
item: [ {
    name: "somename",
    request: {
         body: {
            mode: "somemode",
            raw:": {\n  \"myTest\": {\n    \"name\": \"myItems\"\n  },\n  ....and so on

Я хочу продублировать «элемент» и заполнить «сырые» ключи с некоторыми примерными значениями. Похоже, все работает нормально при изменении name (элемента), но когда я пытаюсь присвоить новое значение секции 'raw' - он просто заполняет все элементы массива одинаковым значением

не могли бы вы указать на мою ошибку?

Моя цель - создать 4 элемента в моем массиве элементов, каждый из которых имеет соответствующее значение myTest.

import fs from 'fs';
import data from './collections/testCollection.json';
import { raw, json } from 'express';

export class Reader {
    mypath: string;

    constructor(mypath:string) {
        this.mypath = mypath;
    }

    test(): void {
        //console.log(this.mypath);
    }

    readFile(): void {
        var x = data;   #all json data
        var body = data.item; # this is the array of items
        var firstItem = body[0];

        let arrayOfOptionsForRT: string[] = ['items1', 'items2', 'items3', 'items4'];
        arrayOfOptionsForRT.forEach(function(value:string) {
            var tmp = Object.assign({}, firstItem); # trying to clone one full item 
            tmp.name = value #this changes successfully

            var rawbody:string = tmp.request.body.raw;

            var parsedbodyobject = JSON.parse(rawbody);
            console.log('currVal:' + value);
            console.log(parsedbodyobject);
            parsedbodyobject.myTest.name = 'test' + value;

            var newStr = JSON.stringify(parsedbodyobject);
            tmp.request.body.raw = newStr;


            body.push(tmp); # ------ after it is done, all my items get the same name!! :( ---
        });

1 Ответ

1 голос
/ 27 мая 2020

, если у вас есть вложенные объекты (Object.assign ({}, firstItem) не сработает. Поскольку он скопирует значения на первом уровне. Поэтому ссылка на второй уровень будет скопирована. Поэтому произойдет мутация. Anees сказал, что вы можете go с 1.loda sh library 2. JSON .parse (JSON .stringify (firstItem)) Но в варианте 2 вы потеряете функциональные свойства объекта, если таковые имеются. см. это https://medium.com/@karthikneeliyan / issues-of-object-cloning-in- java -script-883d9e0d92b7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...