是否有支持JavaScript对象自动激活库?(Is there a library to supp

2019-07-04 00:35发布

有反正,无论是本地还是通过库,对JavaScript对象使用自动激活?

IE,假设foo是无属性的对象,能够只是做foo.bar.baz = 5而不是需要foo.bar = {}; foo.bar.baz = 5 foo.bar = {}; foo.bar.baz = 5

Answer 1:

你不能用你想要的语法做它到底。 但是,像往常一样,在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);

如果不担心barbaz定义。 如果你不喜欢[..]在函数调用你总是可以遍历arguments对象。



Answer 2:

纯天然,我不这么认为。 undefined是不可扩展或改变的,这就是关于我能想象这样做没有传递给它通过函数的唯一途径。



Answer 3:

我不得不这样做的愿望,所以我写了一个包来处理它 。

% 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' ] } }


Answer 4:

或者你也可以使用基于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()


Answer 5:

@ 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


文章来源: Is there a library to support autovivification on Javascript objects?