2017-10-20 4 views
1

Comment pourrais-je améliorer ce code pour ne pas utiliser tant _.each et en ne vérifiant pas toujours l'objet emptyness de ses propriétésComment le groupe par un paramètre imbriqué

_.each(initial_obj, function(value, key){ 
    _.each(value, function(value2, key2){ 
     _.each(value2, function(value3, key3){ 
     _.isEmpty(new_obj[key3]) && (new_obj[key3] = {}); 
     _.isEmpty(new_obj[key3][key]) && (new_obj[key3][key] = []); 
     new_obj[key3][key][key2] = value3; 
     }) 
    }) 
    }) 


old_obj: {'a': {'en', 'es', 'pt'}, 'b': {'en', 'es', 'pt'}, 'c': {'en', 'es', 'pt'}}) 

    new_obj: {'en': ['a': [], 'b': [], 'c': []}, 
          'es': {'a': [], 'b': [], 'c': []}, 
          'pt': {'a': [], 'b': [], 'c': []} 
          }) 

Répondre

2

Iterate les clés de l'objet utilisant Object#keys et Array#reduce. Puis itérer le tableau interne, avec Array#forEach. Pour chaque chaîne dans le tableau, assign la key avec un tableau vide:

const obj = {'a': ['en', 'es', 'pt'], 'b': ['en', 'es', 'pt'], 'c': ['en', 'es', 'pt']}; 
 

 
const result = Object.keys(obj).reduce((r, key) => { 
 
    obj[key].forEach((str) => r[str] = Object.assign(r[str] || {}, { [key]: [] })); 
 
    
 
    return r; 
 
}, {}); 
 

 
console.log(result);

+0

Ouvrir une nouvelle question, avec les nouvelles données valides. –

+0

Oui, travailler dans ça! –

+0

https://stackoverflow.com/questions/46858413/how-to-group-by-a-mix-of-nested-parameter-objects-and-arrays;] –

0

Avec Ruby:

h = { a: ['en', 'es', 'pt'], b: ['en', 'es', 'pt'], c: ['en', 'es', 'pt'] } 

values = h.first.last 
    #=> ["en", "es", "pt"] 
h.keys.map { |k| [k, values.map { |v| [v,[]] }.to_h] }.to_h 
    #=> {:a=>{"en"=>[], "es"=>[], "pt"=>[]}, 
    # :b=>{"en"=>[], "es"=>[], "pt"=>[]}, 
    # :c=>{"en"=>[], "es"=>[], "pt"=>[]}}