javascript中的对象转换

时间:2015-03-11 02:35:32

标签: javascript

我有一个我需要转换为不同格式的对象

原文:

{"module1":{"mod1":[{"hours":10},{"weeks":2},{"days":15}]},
 "module2":{"mod2":[{"cars":1},{"cats":5},{"people":4}]},
}

期望的结果:

{"module1":"/mod1/10/2/15","module2":"/mod2/1/5/4" }

这是我的尝试(对不起,我还在学习这个)

  function(newUrl){
            var encodedUrl = {};
            var tempString = "";
            console.log(JSON.stringify(newUrl));
             for (var p in newUrl) {

                    tempString = "/" + Object.keys(newUrl[p]);

               for (var j in newUrl[p]){
                    _.each(newUrl[p][j], function(obj){
                        tempString += "/" + _.values(obj);
                    });
                    encodedUrl[p] = tempString;
                    console.log(encodedUrl);
               }

             }

        }

所以,我认为我能够正确地制作字符串。不过它似乎只是第一次工作。它以奇怪的模式登录

 Object {module1: "/mod1/10/2/15"}
 Object {module1: "/mod1///"}
 Object {module1: "/mod1///", module2: "/mod2/1/5/4"}

我认为我在解析这个问题时遇到了一些问题,但我无法确定它。会爱第二双眼睛来帮忙。谢谢!

2 个答案:

答案 0 :(得分:2)

您必须依次遍历每个对象的属性,提取属性名称和值。还有一个数组,所以你也必须循环它。

4个嵌套循环。

function  transformObj(obj) {

  var tObj, tStr, tArr, aObj, result = {};

  // For each own property in the object, e.g. 'module1'
  for (var p in obj) {
    if (obj.hasOwnProperty(p)) {

      // Transorm the value
      tObj = obj[p];
      tStr = '';

      // For each property in that object, e.g. 'mod1'
      for (var q in tObj) {
        if (tObj.hasOwnProperty(q)) {
          tStr = '/' + q;

          tArr = tObj[q];

          // for each member of the array
          for (var i=0, iLen=tArr.length; i<iLen; i++) {
            aObj = tArr[i]

            // for each property of each member, e.g. hours, weeks days
            for (var r in aObj) {
              if (aObj.hasOwnProperty(r)) {
                tStr += '/' + aObj[r];
              }
            }
          }
        }
      }

      // Assign transformed value to result object
      result[p] = tStr;
    }
  }
  return result;
}

var obj = {"module1":{"mod1":[{"hours":10},{"weeks":2},{"days":15}]},
           "module2":{"mod2":[{"cars":1},{"cats":5},{"people":4}]},
          };

console.log(JSON.stringify(transformObj(obj))); 

// {"module1":"/mod1/10/2/15","module2":"/mod2/1/5/4"}

您可以使用Object.keys(...).forEach(...)替换 for..in hasOwnProperty 部分以减少代码,但可能会增加复杂性。

请注意, for..in Object.keys 返回属性的顺序将相同,但可能不一定与您预期的一样,并且可能不同从浏览器到浏览器,因此当每个对象都有一个属性时,您只能期望一致的结果。

答案 1 :(得分:1)

可能有一种较短的方式,但似乎你的对象有点复杂。

Object.keys(obj).reduce(function(newObj, key, index) {
    var module = obj[key];
    var moduleKey = 'mod' + (index+1);
    var arr = module[moduleKey].map(function(o){return o[Object.keys(o)[0]]}).join('/');
    newObj[key] = "/" + moduleKey + "/" + arr
    return newObj
}, {});