是否有一个库来支持Javascript对象的自动修复?

时间:2012-11-21 17:02:40

标签: javascript object autovivification

无论如何,无论是本地还是通过库,都可以在Javascript对象上使用自动生成功能?

IE,假设foo是没有属性的对象,只能foo.bar.baz = 5而不是foo.bar = {}; foo.bar.baz = 5

5 个答案:

答案 0 :(得分: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);

无需担心是否定义了barbaz。如果您不喜欢函数调用中的[..],则可以始终遍历arguments对象。

答案 1 :(得分:2)

纯粹本地人,我不这么认为。 undefined不可扩展或可更改,这是我可以想象的唯一方式,而不会通过函数传递它。

答案 2 :(得分:2)

我有这样的愿望,所以我写了a package to handle it

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

@ 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