Lodash DeepClone проблема при строковых с toJSON - PullRequest
1 голос
/ 18 октября 2019

Кажется, что lodash deepClone имеет проблему при строковом преобразовании с toJSON. Пожалуйста, посмотрите на код ниже.

Вывод на консоль:

Stringify: test_cloneThroughLodash: called
{"id":"a_1","a1s":[{"id":"a1_1"}]}
{"id":"a_1","a1s":[{"id":"a1_1"}]}
Stringify: test_cloneThroughCode: called
{"id":"a_1","a1s":[{"id":"a1_1"}]}
{"id":"a_1","a1s":[{"id":"a1_1"},{"id":"a1_3"}]}

, в то время как я ожидаю:

Stringify: test_cloneThroughLodash: called
{"id":"a_1","a1s":[{"id":"a1_1"}]}
{"id":"a_1","a1s":[{"id":"a1_1"},{"id":"a1_2"}]}
Stringify: test_cloneThroughCode: called
{"id":"a_1","a1s":[{"id":"a1_1"}]}
{"id":"a_1","a1s":[{"id":"a1_1"},{"id":"a1_3"}]}

Уведомление , {"id": "a1_2"} в ожидаемом выводе - третья строка.

Причина, по которой я ожидаю вышеизложенного, заключается в том, что я добавляю еще один элемент в массив "a1s" в клонированном объекте.

Если я удаляю toJSON функция из класса A, результат является ожидаемым. Я пытался сделать toJSON общедоступным, но результат был таким же.

Также обратите внимание, что если я клонирую, используя свой собственный код, создающий каждый объект ( test_cloneThroughCode ), результат будет правильным -ожидаемый результат.

import _ from 'lodash';

export class Stringify
{
    public test_cloneThroughLodash = () =>
    {
        console.log(`Stringify: test_cloneThroughLodash: called`);

        let a = new A("a_1");
        a.a1s.push(new A1("a1_1"));

        let json = JSON.stringify(a);
        console.log(json);

        let aClonned = _.cloneDeep(a);
        aClonned.a1s.push(new A1("a1_2"));
        let jsonClonned = JSON.stringify(aClonned);
        console.log(jsonClonned);
    }

    public test_cloneThroughCode = () =>
    {
        console.log(`Stringify: test_cloneThroughCode: called`);

        let a = new A("a_1");
        a.a1s.push(new A1("a1_1"));

        let json = JSON.stringify(a);
        console.log(json);

        let aClonnedThroughCode = a.clone();
        aClonnedThroughCode.a1s.push(new A1("a1_3"));
        let jsonClonnedThroughCode = JSON.stringify(aClonnedThroughCode);
        console.log(jsonClonnedThroughCode);
    }
}

class A
{
    constructor(id: string)
    {
        this.id = id;
        this.a1s = new Array<A1>();
    }

    id: string;
    a1s: A1[];

    clone = (): A => {
        let c = new A(this.id);
        c.a1s = this.a1s.map(x => x);
        return c;
    }

    private toJSON = () =>
    {
        return {
            id: this.id,
            a1s: this.a1s,
        }
    }
}

class A1
{
    constructor(id: string)
    {
        this.id = id;
    }

    id: string;

    clone = (): A1 => 
    {
        let c = new A1(this.id);
        return c;
    }

    private toJSON = () =>
    {
        return {
            id: this.id
        }
    }
}
...