在JavaScript中递归转换对象

时间:2015-07-26 18:57:25

标签: javascript json function recursion

我几天来一直在努力解决这个问题。我必须将一个对象转换为另一个具有不同结构的对象。

来自:

{
  "a1" : "key",
  "a2" : {
    "b1" : "key",
    "b2" : {
      "c1" : "key"
    }
  }
}

到此:

{
  "key" : {
    "a1" : null,
    "a2" : [
      { 
        "b1" : null,
      },
      {
        "b2" : [
          "c1" : null
        ]
      }
    ]
  }
}

为了更好地理解,a1a2b1b3等代表css选择器。 null将是应用于节点的值。但就目前而言,这不重要。

我当前(不工作)的功能如下所示:

var json = {};
var obj = {};

function build(objA){
  for(var a in objA){
    var key = objA[a]; 

    if(key instanceof Object){
      obj = {}; obj[a] = key;
      build(key);
    } else {
      json[key] = json[key] || {};

      if(obj == undefined){
        json[key][a] = null;
      } else {
        var p = firstKeyOf(obj);
        var key = obj[p][a];
        json[key][p] = json[key][p] || [];

        var selector = {};
        selector[a] = null;

        json[key][p].push(selector);
      }
    }
  }
}

产生:

{
  "key" : {
    "a1" : null,
    "a2" : [
      {
        "b1" : null
      }
    ],
    "b2" : [
      {
        "c1" : null
      }
    ]
  }
}

我错过了什么?感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

试试这个

var Converter = (function() {

var pic;

function _rec(a, o) {
    for(var k in o){
        var s = o[k];
        var arr = a.slice();
        arr.push(k);
        if (s instanceof Object) { _rec(arr, s); }
        else {
            if ("string" == typeof s) { arr.unshift(s); _attach(pic, arr); }
            else console.log('Invalid key type');
        }
    }
}

function _attach(p, m) {
    var k = m.shift(); 
    if ( ! p.hasOwnProperty(k)) p[k] = (m.length == 0) ? null : {};
    if (m.length > 0) p[k] = _attach(p[k], m);
    return p;
}

function _reverse(obj) { 
    if ( ! (obj instanceof Object)) console.log('First parameter need to be an Object'); 
    else { pic = {}; _rec([], obj); return pic; }
    }
return {
    reverse: _reverse,
    attach: _attach
}
})();