将javascript点表示法对象转换为嵌套对象

Oli*_*ier 14 javascript

我正在尝试构建一个扩展对象的函数,如:

{
    'ab.cd.e' : 'foo',
    'ab.cd.f' : 'bar',
    'ab.g' : 'foo2'
}
Run Code Online (Sandbox Code Playgroud)

进入嵌套对象:

{ab: {cd: {e:'foo', f:'bar'}, g:'foo2'}}
Run Code Online (Sandbox Code Playgroud)

喜欢这个php函数:Set :: expand()

当然不使用eval.

bro*_*ofa 25

我相信这就是你所追求的:

function deepen(o) {
  var oo = {}, t, parts, part;
  for (var k in o) {
    t = oo;
    parts = k.split('.');
    var key = parts.pop();
    while (parts.length) {
      part = parts.shift();
      t = t[part] = t[part] || {};
    }
    t[key] = o[k]
  }
  return oo;
}
Run Code Online (Sandbox Code Playgroud)

例如:

> JSON.stringify(deepen({'ab.cd.e' : 'foo', 'ab.cd.f' : 'bar', 'ab.g' : 'foo2'}))`

"{"ab":{"cd":{"e":"foo","f":"bar"},"g":"foo2"}}"
Run Code Online (Sandbox Code Playgroud)

  • 我在下面提出了一个更全面的解决方案:https://github.com/Gigzolo/dataobject-parser (2认同)

Hen*_*eng 6

如果你正在使用Node.js(例如 - 如果没有剪切并粘贴我们的模块),试试这个包:https://www.npmjs.org/package/dataobject-parser

构建了一个执行正向/反向操作的模块:

https://github.com/Gigzolo/dataobject-parser

它现在被设计为自我管理对象.通过实例化DataObjectParser的实例来使用.

var structured = DataObjectParser.transpose({
    'ab.cd.e' : 'foo',
    'ab.cd.f' : 'bar',
    'ab.g' : 'foo2'
});                                                                                                                                                                                                                                                                                                                                                                                                                                                   
Run Code Online (Sandbox Code Playgroud)

structured.data() 返回嵌套对象:

{ab: {cd: {e:'foo', f:'bar'}, g:'foo2'}}

所以这是JSFiddle中的一个工作示例:

http://jsfiddle.net/H8Cqx/


Esa*_*ija 5

函数名称很糟糕,代码很快就制成了,但是应该可以。请注意,这会修改原始对象,我不确定您是否要创建一个新对象,它是旧对象的扩展版本。

(function(){

    function parseDotNotation( str, val, obj ){
    var currentObj = obj,
        keys = str.split("."), i, l = keys.length - 1, key;

        for( i = 0; i < l; ++i ) {
        key = keys[i];
        currentObj[key] = currentObj[key] || {};
        currentObj = currentObj[key];
        }

    currentObj[keys[i]] = val;
    delete obj[str];
    }

    Object.expand = function( obj ) {

        for( var key in obj ) {
        parseDotNotation( key, obj[key], obj );
        }
    return obj;
    };

})();



var expanded = Object.expand({
    'ab.cd.e' : 'foo',
        'ab.cd.f' : 'bar',
    'ab.g' : 'foo2'
});



JSON.stringify( expanded );  


//"{"ab":{"cd":{"e":"foo","f":"bar"},"g":"foo2"}}"
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 5

您可以将键字符串拆分为路径,并通过使用未访问级别的默认对象来减少它以分配值。

function setValue(object, path, value) {
    var keys = path.split('.'),
        last = keys.pop();

    keys.reduce((o, k) => o[k] = o[k] || {}, object)[last] = value;
    return object;
}

var source = { 'ab.cd.e': 'foo', 'ab.cd.f': 'bar', 'ab.g': 'foo2' },
    target = Object
        .entries(source)
        .reduce((o, [k, v]) => setValue(o, k, v), {});

console.log(target);
Run Code Online (Sandbox Code Playgroud)