2016-08-08 3 views
2

Для следующего массива объектовЛучшее решение для Unflattening массив объектов

[ 
{"Corp": "ABC", "T1": "HW A/V", "T2": "A/V System","T3": "Audio","Prod": "Audio System","Mfr": "One"}, 
{"Corp": "ABC", "T1": "HW A/V", "T2": "A/V System","T3": "Audio","Prod": "Audio System","Mfr": "Two"}, 
{"Corp": "ABC", "T1": "HW A/V", "T2": "A/V System","T3": "Video","Prod": "Video System","Mfr": "Other"} 
] 

Я намерен получить unflatten объект, как показано ниже:

[{ 
"Corp": "ABC", 
"List": [{ 
    "T1": "HW A/V", 
    "List": [{ 
     "T2": "A/V System", 
     "List": [{ 
      "T3": "Audio", 
      "List": [{ 
       "Prod": "Audio System", 
       "List": [ 
        {"Mfr": "One"}, 
        {"Mfr": "Two"} 
       ] 
      }] 
     }, 
     { 
      "T3": "Video", 
      "List": [{ 
       "Prod": "Video System", 
       "List": [ 
        {"Mfr": "Other"} 
       ] 
      }] 
     }] 
    }] 
}] 

}] я сделал получить результат Я намерен получить, как описано выше. Я использовал знак подчеркивания, чтобы получить результат. Следующий фрагмент кода сделал работу для меня:

var items = _.map(_.groupBy(itemList, 'Corp'), function (a) { 
     return _.extend(_.pick(a[0], 'Corp'), { 
      List: _.map(_.groupBy(a, 'T1'), function (b) { 
       return _.extend(_.pick(b[0], 'T1'), { 
        List: _.map(_.groupBy(b, 'T2'), function (c) { 
         return _.extend(_.pick(c[0], 'T2'), { 
          List: _.map(_.groupBy(c, 'T3'), function (d) { 
           return _.extend(_.pick(d[0], 'T3'), { 
            List: _.map(_.groupBy(d, 'Prod'), function (e) { 
             return _.extend(_.pick(e[0], 'Prod'), { 
              List: _.map(e, function (elem) { 
               return _.pick(elem, 'Mfr') 
              }) 
             }); 
            }) 
           }); 
          }) 
         }); 
        }) 
       }); 
      }) 
     }); 
    }); 

Теперь Так Все, что я ищу, если кто-то может улучшить мое решение. Я хочу оптимизировать пространство и время для этого процесса.

PS: утром, я задал аналогичный вопрос с просьбой к решению, и этот вопрос был отмечен какслишком широка и был поставлен на ДЕРЖАТЬ, поэтому я добавил мое решение с этим вопросом , теперь все, что я ищу, - лучшее решение.

Благодаря

+0

[Там нет такого понятия, как "JSON объект"] (http://benalman.com/news/2010/03/theres-no-such-thing-as-a -json /) – Andreas

+2

Обзор кода может быть лучшим местом, чтобы задать этот вопрос, так как нет реальной проблемы, что вы хотите улучшить уже рабочий код. – akinuri

+0

@JLRishe oh ... My bad ... thats, потому что я скопировал некоторую часть вопроса из моего более раннего вопроса. – Nitin

ответ

2

Для того, чтобы избежать внахлест заявления, вы можете определить список «развернуть ключи» и перебирать на них.

Это наполовину заманчивым для автоматического извлечения ключей с чем-то вроде:

expandKeys = _.keys(itemList[0]); 

Но поскольку Javascript не гарантирует порядок ключей в объекте, вы действительно должны определить этот список явно вместо этого.

Ниже приведен пример кода.

var itemList = [ 
 
    {"Corp": "ABC", "T1": "HW A/V", "T2": "A/V System", "T3": "Audio", "Prod": "Audio System", "Mfr": "One"}, 
 
    {"Corp": "ABC", "T1": "HW A/V", "T2": "A/V System", "T3": "Audio", "Prod": "Audio System", "Mfr": "Two"}, 
 
    {"Corp": "ABC", "T1": "HW A/V", "T2": "A/V System", "T3": "Video", "Prod": "Video System", "Mfr": "Other"} 
 
]; 
 

 
var expandKeys = [ 'Corp', 'T1', 'T2', 'T3', 'Prod', 'Mfr' ]; 
 

 
function expandList(list, keys) { 
 
    var node, obj, root = {}; 
 

 
    _.each(list, function(item) { 
 
    obj = root; 
 
    _.each(keys, function(key) { 
 
     obj = (obj.List = obj.List || []); 
 
     node = _.find(obj, function(i) { return i[key] == item[key]; }); 
 

 
     if(node === undefined) { 
 
     obj.push(node = {}); 
 
     node[key] = item[key]; 
 
     } 
 
     obj = node; 
 
    }); 
 
    }); 
 
    return root.List; 
 
} 
 

 
var res = expandList(itemList, expandKeys); 
 
console.log(res);
<script src="http://underscorejs.org/underscore-min.js"></script>

Смежные вопросы