有反正,无论是本地还是通过库,对JavaScript对象使用自动激活?
IE,假设foo
是无属性的对象,能够只是做foo.bar.baz = 5
而不是需要foo.bar = {}; foo.bar.baz = 5
foo.bar = {}; foo.bar.baz = 5
。
有反正,无论是本地还是通过库,对JavaScript对象使用自动激活?
IE,假设foo
是无属性的对象,能够只是做foo.bar.baz = 5
而不是需要foo.bar = {}; foo.bar.baz = 5
foo.bar = {}; foo.bar.baz = 5
。
你不能用你想要的语法做它到底。 但是,像往常一样,在JS你可以编写自己的功能:
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;
}
所以现在你可以这样做:
// as per you example:
set(foo,['bar','baz'],5);
如果不担心bar
或baz
定义。 如果你不喜欢[..]
在函数调用你总是可以遍历arguments
对象。
纯天然,我不这么认为。 undefined
是不可扩展或改变的,这就是关于我能想象这样做没有传递给它通过函数的唯一途径。
我不得不这样做的愿望,所以我写了一个包来处理它 。
% npm install autovivify
% node
> Av = require('autovivify')
> foo = new Av()
{}
> foo.bar.baz = 5
5
> foo
{ bar: { baz: 5 } }
>
它甚至会做与数字标数组:
> foo = new Av()
> foo.bar.baz[0] = 'hum'
> foo
{ bar: { baz: [ 'hum' ] } }
或者你也可以使用基于EVAL-解决方案。 这是丑陋的,不建议使用。
function av(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";
} // while
return res + xpr;
} // av()
function main() {
var a = {};
a["keep"] = "yep";
eval(av('a[1][1]["xx"] = "a11xx"; '));
eval(av('a[1][2]["xx"] = "a12xx"; '));
console.log(a);
} // main()
@ slebetman的代码似乎并没有工作。 最后的关键不应该被分配一个空对象,而是val
。 此代码的工作:
function autoviv(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