Как сгруппировать по вложенному параметру

1

Как я могу улучшить этот код, не использует так много _.each и не всегда проверяет пустоту объекта своих свойств

  _.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': []}
                          })
Теги:
each
is-empty

2 ответа

2
Лучший ответ

Итерируйте ключи объекта с помощью клавиш Object # и Array # reduce. Затем переместите внутренний массив с массивом # forEach. Для каждой строки массива назначьте key пустым массивом:

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
    Откройте новый вопрос с новыми действительными данными.
  • 0
    Да, работаю в этом!
Показать ещё 1 комментарий
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню