Skip to content

Commit 3dad4ff

Browse files
committed
estimateAttributes: Do deep clones even for deeply nested objects
Improved the regression test for issue #1450
1 parent 4c5dbf5 commit 3dad4ff

File tree

2 files changed

+38
-6
lines changed

2 files changed

+38
-6
lines changed

src/ObjectStateMutations.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,14 @@ export function estimateAttributes(
120120
if (attr.includes('.')) {
121121
// convert a.b.c into { a: { b: { c: value } } }
122122
const fields = attr.split('.');
123-
const first = fields[0];
124123
const last = fields[fields.length - 1];
125-
if (data[first] === serverData[first]) data[first] = { ...serverData[first] }; // Do a deep copy
126-
let object = { ...data };
124+
let object = data;
127125
for (let i = 0; i < fields.length - 1; i++) {
128126
const key = fields[i];
129127
if (!(key in object)) {
130128
object[key] = {};
129+
} else {
130+
object[key] = { ...object[key] };
131131
}
132132
object = object[key];
133133
}

src/__tests__/ParseObject-test.js

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -676,23 +676,55 @@ describe('ParseObject', () => {
676676
objectField: {
677677
number: 5,
678678
letter: 'a',
679+
nested: {
680+
number: 0,
681+
letter: 'b',
682+
},
679683
},
680684
});
681685

682686
expect(o.attributes).toEqual({
683-
objectField: { number: 5, letter: 'a' },
687+
objectField: { number: 5, letter: 'a', nested: { number: 0, letter: 'b' } },
684688
});
685689
o.set('objectField.number', 20);
686690
o.set('objectField.letter', 'b');
691+
o.set('objectField.nested.number', 1);
692+
o.set('objectField.nested.letter', 'c');
687693

688694
expect(o.attributes).toEqual({
689-
objectField: { number: 20, letter: 'b' },
695+
objectField: { number: 20, letter: 'b', nested: { number: 1, letter: 'c' } },
690696
});
691697
expect(o.op('objectField.number') instanceof SetOp).toBe(true);
692-
expect(o.dirtyKeys()).toEqual(['objectField.number', 'objectField.letter', 'objectField']);
698+
expect(o.dirtyKeys()).toEqual([
699+
'objectField.number',
700+
'objectField.letter',
701+
'objectField.nested.number',
702+
'objectField.nested.letter',
703+
'objectField',
704+
]);
705+
expect(o._getSaveJSON()).toEqual({
706+
'objectField.number': 20,
707+
'objectField.letter': 'b',
708+
'objectField.nested.number': 1,
709+
'objectField.nested.letter': 'c',
710+
});
711+
712+
o.revert('objectField.nested.number');
713+
o.revert('objectField.nested.letter');
714+
expect(o._getSaveJSON()).toEqual({
715+
'objectField.number': 20,
716+
'objectField.letter': 'b',
717+
});
718+
expect(o.attributes).toEqual({
719+
objectField: { number: 20, letter: 'b', nested: { number: 0, letter: 'b' } },
720+
});
721+
722+
// Also test setting new root fields using the dot notation
723+
o.set('objectField2.number', 0);
693724
expect(o._getSaveJSON()).toEqual({
694725
'objectField.number': 20,
695726
'objectField.letter': 'b',
727+
'objectField2.number': 0,
696728
});
697729
});
698730

0 commit comments

Comments
 (0)