Skip to content

Commit e227054

Browse files
committed
fix: handling updates for arrays using dotnotation
1 parent 3f7b06e commit e227054

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

src/index.js

+19-6
Original file line numberDiff line numberDiff line change
@@ -290,14 +290,17 @@
290290
for (const key of Object.keys(data)) {
291291
let newObject = object;
292292
let oldObject = new Object(newObject);
293-
let keys = key.replace(/\[(\d+)\]/g, ".$1").split(".");
293+
let keys = key
294+
.replace(/\[(\d+)\]/g, ".$1")
295+
.split(".")
296+
.map((k) => (isNaN(k) ? k : Number(k)));
294297
let value = data[key];
295298
let operator;
296299
if (keys[0].startsWith("$")) operator = keys.shift();
297300

298301
let length = keys.length - 1;
299302
for (let i = 0; i < keys.length; i++) {
300-
if (/^\d+$/.test(keys[i])) keys[i] = parseInt(keys[i]);
303+
// if (/^\d+$/.test(keys[i])) keys[i] = parseInt(keys[i]);
301304

302305
if (length == i) {
303306
if (operator) {
@@ -411,12 +414,22 @@
411414
if (typeof keys[i] === "number")
412415
newObject.splice(keys[i], 1);
413416
else delete newObject[keys[i]];
414-
} else newObject[keys[i]] = value;
417+
} else if (typeof keys[i] === "number") {
418+
newObject.splice(keys[i], 0, value);
419+
} else {
420+
newObject[keys[i]] = value;
421+
}
422+
} else if (
423+
typeof keys[i + 1] === "number" &&
424+
!Array.isArray(newObject[keys[i]])
425+
) {
426+
newObject[keys[i]] = [];
415427
} else {
416-
newObject[keys[i]] = oldObject[keys[i]] || {};
417-
newObject = newObject[keys[i]];
418-
oldObject = oldObject[keys[i]];
428+
newObject[keys[i]] = newObject[keys[i]] || {};
429+
// newObject[keys[i]] = oldObject[keys[i]] || {};
430+
// oldObject = oldObject[keys[i]];
419431
}
432+
newObject = newObject[keys[i]];
420433
}
421434
}
422435
return object;

0 commit comments

Comments
 (0)