Typescript сопоставляет объект с другой структурой

#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);