#javascript #typescript #dictionary
#javascript #typescript #словарь
Вопрос:
У меня есть объект с конкретной структурой. Я хочу создать другой объект с другой структурой…Что-то вроде .map()
const Object: Icon = {
Laughing: {
iconClass: 'emoticon-3',
name: 'Laughing :D',
dataText: ':D',
},
Surprise: {
iconClass: 'emoticon-4',
name: "Surprise, No you di'int' :O",
dataText: ':O',
}
.......
}
и я хочу сопоставить его с другой структурой объекта:
const Object2: Type2 = {
:D: {
iconClass: 'emoticon-3',
name: 'Laughing :D',
},
:O: {
iconClass: 'emoticon-4',
name: "Surprise, No you di'int' :O",
}
.......
}
Комментарии:
1. Вы указываете требование. Пожалуйста, также попробуйте добавить то, что вы пробовали, и на каком фронте вы столкнулись с проблемой преобразования данных.
Ответ №1:
Вы можете использовать Object.values()
и reduce
. Используйте деструктурирование для получения dataText
в качестве отдельной переменной и остальных свойств rest
переменной, подобной этой: { dataText, ...rest }
const obj = {
Laughing: {
iconClass: 'emoticon-3',
name: 'Laughing :D',
dataText: ':D',
},
Surprise: {
iconClass: 'emoticon-4',
name: "Surprise, No you di'int' :O",
dataText: ':O',
}
}
const newObj = Object.values(obj).reduce((acc, { dataText, ...rest }) => {
acc[dataText] = rest;
return acc
}, {})
console.log(newObj)
Как предложил @jo_va, вы также могли бы неявно возвращать из reduce
:
Object.values(obj).reduce((acc, { dataText, ...rest }) => ({ ...acc, [dataText]: rest }), {})
Комментарии:
1. Вы можете сократить тело с неявным возвратом ({ …acc, [DataText]: rest })
2. @jo_va ты прав. Я добавил это к ответу.
Ответ №2:
Вы можете использовать array#map
для создания массива объектов, а затем с помощью Object.assign()
создать один объект.
const obj = { Laughing: { iconClass: 'emoticon-3', name: 'Laughing :D', dataText: ':D', }, Surprise: { iconClass: 'emoticon-4', name: "Surprise, No you di'int' :O", dataText: ':O', } },
result = Object.assign(...Object.values(obj).map(({dataText, ...o}) => ({[dataText] : o})));
console.log(result);