Carduelis
@Carduelis
Web-developer, front-end, js, less

Наполнение объекта javascript в цикле, как сделать элегантно?

Вот, допустим, есть два первых объекта (массива) и Нам нужно положить эти данные в новый объект (третий)

users : [{
    name : 'Вася',
    phone: 123345
    },{
    name : 'Петя',
    phone: 789901
}]

jobs : {
    'Слесарь' : ['Вася','Петя'],
    'Пекарь' : ['Гена','Лена'],
}

obj : {
    users: {
     'Вася' : {
           'job': 'Слесарь', 
           'phone' : 123345
     },
     'Петя' : {
           'job': 'Слесарь', 
           'phone' : 789901
     },
     'Гена' : {
           'job': 'Пекарь', 
           'phone' : null
      },
     'Лена' : {
           'job': 'Пекарь', 
           'phone' : null
      },
}
obj : {
     putUsers : function(users) {
            for (var i in users) {
                   var newName = users[i].name;
                   if (!this.users) {
                        this.users = {}
                   }
                   if (!this.users[newName]) {
                       this.users[newName] = {}
                   }
            }
     }
}
obj.putUsers(users);

Вопроса два:
  1. Как избежать этих жутких if-ов при создании новых объектов/ключей (при создании в цикле), когда нам нужно на первой итерации (i у нас не число) создать объект, а потом его пополнять
  2. Как элегантнее обновить получившийся объект после функции obj.putUsers() объектом jobs?
  • Вопрос задан
  • 4160 просмотров
Решения вопроса 1
@Roman_Kh
Чтобы избавиться от "жутких if'ов" и сделать элегатное обновление вам нужно
1. изменить структуры данных: users и jobs должны стать map'ами по именам пользователей.
users = {
     'Вася' : {
           'job': 'Слесарь', 
           'phone' : 123345
     },
     'Петя' : {
           'job': 'Слесарь', 
           'phone' : 789901
     }
}

jobs = {
     'Вася' : { 'job': 'Плотник' },
     'Петя' : { 'job': 'Столяр' }
}

2. применить Object.assign (или object-assign)
И тогда весь ваш цикл превратится в одну строчку
Object.assign(obj.users, users)
И обновление работ также уместится на одной строке:
Object.assign(obj.users, jobs)
Или можно объединить обе операции:
Object.assign(obj.users, users, jobs)

Обратите внимание, что в случае с object-assign будет чуть-чуть иначе:
obj.users = object_assign(obj.users, users, jobs)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
romy4
@romy4
Exception handler
непонятно, чем вас пугает if? это конструкция логики. проанализируйте банально любую свою мысль и сосчитайте количество условий
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы