Is There A Library To Support Autovivification On Javascript Objects?
Is there anyway, either natively or through a library, to use autovivification on Javascript objects? IE, assuming foo is an object with no properties, being able to just do foo.ba
Solution 1:
You can't do it exactly with the syntax you want. But as usual, in JS you can write your own function:
function set (obj,keys,val) {
for (var i=0;i<keys.length;i++) {
var k = keys[i];
if (typeof obj[k] == 'undefined') {
obj[k] = {};
}
obj = obj[k];
}
obj = val;
}
so now you can do this:
// as per you example:set(foo,['bar','baz'],5);
without worrying if bar
or baz
are defined. If you don't like the [..]
in the function call you can always iterate over the arguments
object.
Solution 2:
Purely natively, I don't think so. undefined
isn't extensible or changeable and that's about the only way I could imagine doing it without passing it through a function.
Solution 3:
I had a desire to do this, so I wrote a package to handle it.
% npm install autovivify% node> Av = require('autovivify')> foo = new Av()
{}
> foo.bar.baz = 5
5
> foo
{ bar: { baz: 5 } }
>
It'll even do arrays with numeric subscripts:
> foo = new Av()> foo.bar.baz[0] = 'hum'> foo
{ bar: { baz: [ 'hum' ] } }
Solution 4:
Or you can use an eval-based solution. It's ugly, not recommended.
functionav(xpr) {
var res = "";
var pos = 0;
while (true) {
var pos = xpr.indexOf("[",pos);
if (pos == -1) break;
var frag = xpr.substr(0,pos);
pos++;
res += "if (typeof(" + frag + ") != 'object') " + frag + " = {};\n";
} // whilereturn res + xpr;
} // av()functionmain() {
var a = {};
a["keep"] = "yep";
eval(av('a[1][1]["xx"] = "a11xx"; '));
eval(av('a[1][2]["xx"] = "a12xx"; '));
console.log(a);
} // main()
Solution 5:
@slebetman's code doesn't seem to work. The last key should not be assigned an empty object, but rather the val
. This code worked:
functionautoviv(obj,keys,val) {
for (var i=0; i < keys.length; i++) {
var k = keys[i];
if (typeof obj[k] === 'undefined') {
if(i === keys.length-1) {
obj[k] = val;
return;
}
obj[k] = {};
}
obj = obj[k];
}
}
foo = {}
autoviv(foo,['bar','baz'],5);
console.log(foo.bar.baz);
5
Post a Comment for "Is There A Library To Support Autovivification On Javascript Objects?"