2016-08-08 1 views
2

Pour le tableau suivant des objetsmeilleure solution pour Unflattening tableau d'objets

[ 
{"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"} 
] 

Je souhaite obtenir un objet Redresser comme celui ci-dessous:

[{ 
"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"} 
       ] 
      }] 
     }] 
    }] 
}] 

}] Je l'ai fait obtenir le résultat J'ai l'intention d'obtenir comme décrit ci-dessus. J'ai utilisé le trait de soulignement pour obtenir le résultat. À la suite de l'extrait de code a fait le travail pour moi:

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') 
              }) 
             }); 
            }) 
           }); 
          }) 
         }); 
        }) 
       }); 
      }) 
     }); 
    }); 

maintenant Tout ce que je cherche, est si quelqu'un peut améliorer ma solution. Je veux optimiser à la fois l'espace et le temps pour ce processus.

PS: matin, j'avais posé une question similaire demandant à la solution, et cette question a été marquée commeTOO BROAD et a été mis sur MAINTIEN, donc j'ai ajouté ma solution à cette question , maintenant tout ce que je cherche est une meilleure solution.

Merci

+0

[Il n'y a pas une telle chose comme un "objet JSON"] (http://benalman.com/news/2010/03/theres-no-such-thing-as-a -json /) – Andreas

+2

La revue de code pourrait être un meilleur endroit pour poser cette question puisqu'il n'y a pas un problème réel, que vous voulez améliorer le code fonctionnant déjà. – akinuri

+0

@JLRishe oh ... Mon mauvais ... c'est parce que j'ai copié une partie de la question de ma question précédente. – Nitin

Répondre

2

Afin d'éviter des déclarations imbriquées, vous pouvez vouloir définir une liste de « développer les clés » et itérer sur eux.

Il est à moitié-tentant d'extraire automatiquement les clés avec quelque chose comme:

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

Mais depuis Javascript ne garantit pas l'ordre des clés dans un objet, vous devez vraiment définir cette liste explicitement à la place.

Voici un exemple de code.

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>