2

区切りキーを持つオブジェクトがあり、このオブジェクトをネストされたオブジェクトに変換したいと考えています。JavaScriptまたはノードで行う簡単な方法を知っている人はいますか?

例えば:

    {
      'login': 'my login',
      'work.title': 'my title',
      'work.phone.mobile': '123',
      'work.phone.work': '456'
    }

に変換

   {
      login: 'my login',
      work: {
        title: 'my title',
        phone: {
          mobile: '123',
          work: '456'
        }
      }
    }
4

2 に答える 2

3

あなたはこれを試してみてください

function toObj(str)
{
    var output = {};
    for(var key in str)
    {
        var nodes = key.split('.'), dest = output;
        if(nodes.length < 1) continue;
        for(var i = 0; i < (nodes.length - 1); ++ i)
        {
            var node = nodes[i];
            dest = (dest[node] === undefined) ? (dest[node] = {}) : dest[node];
        }
        dest[nodes[nodes.length - 1]] = str[key];
    }
    return output;
}

通話機能

toObj({
    'login': 'my login',
    'work.title' : 'my title',
    'work.phone.mobile' : '123',
    'work.phone.work' : '456'
});

デモ。

于 2013-09-18T06:00:55.357 に答える
3

最初の引数はフラット化を解除するオブジェクトで、2 番目の引数は変更するobjか新しいオブジェクトを作成するかです。2 番目の引数はオプションで、デフォルトは ですfalse

function unflatten(obj, modify){
    var i, j, keys, ref, result = modify ? obj : {};
    for(i in obj){
        for(keys = i.split('.'), ref = result, j = 0; j < keys.length - 1; j++)
            ref = (ref[keys[j]] = ref[keys[j]] || {});
        ref[keys[j]] = obj[i];
        if(modify && j)
            delete obj[i];
    }
    return result;
}
于 2013-09-18T06:01:29.437 に答える