2015-03-11 4 views
1

У меня есть объект, мне нужно преобразовать в другой форматпреобразование объекта в 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"} 

Я думаю, что я что-то неправильно в моей логике разбор этого, я не могу точно определить его, хотя. Полюбила бы вторую пару глаз, чтобы помочь. Благодаря!

+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"} 

Вы можете заменить for..in и hasOwnProperty части с Object.keys(...).forEach(...) уменьшить код немного, но скорее всего, увеличит сложность.

Обратите внимание, что порядок, в котором свойства возвращаются for..in и Object.keys будет то же самое, но, возможно, не обязательно, как вы ожидаете, и может отличаться от браузера к браузеру, так что вы можете только ожидать согласованных результатов, когда каждый объект имеет одно свойство.

+0

Спасибо, что нашли время, чтобы объяснить :). Очень полезно! – ajmajmajma

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 
}, {}); 
Смежные вопросы