23.02.2021, 10:06
|
Аспирант
|
|
Регистрация: 08.07.2019
Сообщений: 85
|
|
Как задать ключ-значение объекту динамически?
Уже 4 дня голову ломаю, не могу понять как сделать. Гугл не помогает уже. Перебрать значения отдельно могу, вывести могу, а объединить не могу.
Может кто подсказать как создать новый объект, чтобы данные из meta, а именно meta.name и contact перетекли в него по формуле meta.name : contact.name.value?
Имеется объект:
meta: [
{ name: 'surname', title: 'Фамилия', type: 'text' },
{ name: 'name', title: 'Имя', type: 'text' },
{ name: 'secondName', title: 'Отчество', type: 'text' },
{ name: 'phone', title: 'Телефон', type: 'text' },
{ name: 'phone2', title: 'Телефон', type: 'text' },
{ name: 'mail', title: 'E-mail', type: 'text' },
{ name: 'address', title: 'Адрес', type: 'text' }
]
Другой объект:
contact: { "name": "Test", "surname": "FirstFamily", "phone": 21254 }
В итоге надо получить объект:
{ "surname": "FirstFamily" , "name": "Test", "secondName" : "", "phone" : 21254 .... }
Т.е. если surname в contact имеет значение, то в новом объекте имеет это же значение, но если в contact нет вообще ключа (например phone2), то он копируется из meta и значению присваивается ""
Последний раз редактировалось Aruta, 23.02.2021 в 10:09.
|
|
23.02.2021, 10:18
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,109
|
|
Aruta,
let obj = meta.map(a => Object.assign(a, contact));
если вам нужно что-то иное, тогда нужен пример
что на входе, что на выходе полностью
|
|
23.02.2021, 10:27
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,744
|
|
let meta= [
{ name: 'surname', title: 'Фамилия', type: 'text' },
{ name: 'name', title: 'Имя', type: 'text' },
{ name: 'secondName', title: 'Отчество', type: 'text' },
{ name: 'phone', title: 'Телефон', type: 'text' },
{ name: 'phone2', title: 'Телефон', type: 'text' },
{ name: 'mail', title: 'E-mail', type: 'text' },
{ name: 'address', title: 'Адрес', type: 'text' }
];
let contact= { "name": "Test", "surname": "FirstFamily", "phone": 21254 }
const f = (obj, meta) => {
return meta.reduce ((o, {name, title, type}) => (o[name] = (name in obj)? obj[name]+'': '', o), {})
}
console.log(f(contact, meta))
|
|
23.02.2021, 12:24
|
Аспирант
|
|
Регистрация: 08.07.2019
Сообщений: 85
|
|
voraa,
капец... Огроомное спасибо!
Пошел учить глубоко reduce значит
|
|
23.02.2021, 12:39
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,744
|
|
Да тут не в reduce дело.
Можно и без него. Проще, но чуть длиннее.
let meta= [
{ name: 'surname', title: 'Фамилия', type: 'text' },
{ name: 'name', title: 'Имя', type: 'text' },
{ name: 'secondName', title: 'Отчество', type: 'text' },
{ name: 'phone', title: 'Телефон', type: 'text' },
{ name: 'phone2', title: 'Телефон', type: 'text' },
{ name: 'mail', title: 'E-mail', type: 'text' },
{ name: 'address', title: 'Адрес', type: 'text' }
];
let contact= { "name": "Test", "surname": "FirstFamily", "phone": 21254 }
const fnr = (obj, meta) => {
const o = {}
for (const {name} of meta) {
o[name] = '';
if (name in obj) o[name] += obj[name];
}
return o;
}
console.log(fnr(contact, meta))
|
|
|
|