diff --git a/index.js b/index.js index febdfbf..fc8761b 100644 --- a/index.js +++ b/index.js @@ -37,15 +37,23 @@ function set(target, path, value, options) { for (let i = 0; i < len; i++) { let prop = keys[i]; - if (i === len - 1) { - result(target, prop, value, merge); - break; + if (i < len - 1 && !isNaN(keys[i + 1]) && !target[prop]) { + target[prop] = []; + } + + if (!isNaN(prop)) { + target.push({}); } if (!isObject(target[prop])) { target[prop] = {}; } + if (i === len - 1) { + result(target, prop, value, merge); + break; + } + target = target[prop]; } @@ -107,4 +115,4 @@ function isObject(val) { } set.memo = {}; -module.exports = set; +module.exports = set; \ No newline at end of file diff --git a/test.js b/test.js index 44c5102..f8b36a4 100644 --- a/test.js +++ b/test.js @@ -81,6 +81,17 @@ describe('set', function() { assert.deepEqual(o.a[2].c, {y: 'z'}); }); + it('should create an array if it does not already exist', function() { + var o = {}; + set(o, 'a.0.a', {y: 'z'}); + set(o, 'a.1.b', {y: 'z'}); + set(o, 'a.2.c', {y: 'z'}); + assert(Array.isArray(o.a)); + assert.deepEqual(o.a[0].a, {y: 'z'}); + assert.deepEqual(o.a[1].b, {y: 'z'}); + assert.deepEqual(o.a[2].c, {y: 'z'}); + }); + it('should create a deeply nested property if it does not already exist', function() { var o = {}; set(o, 'a.b.c.d.e', 'c');