Кажется, что 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
}
}
}