Как преобразовать набор полей внутри объектов в javascript и реагировать

#javascript #reactjs #algorithm #react-native #data-structures

#javascript #reactjs #алгоритм #react-native #структуры данных

Вопрос:

У меня есть следующий объект в React :

 const userData = 
  {
    id: 30,
    firstName: "James",
    lastName: "Anderson",
    programmingLanguage: "Java, Python",              # HERE
    LanguageSpoken: "French, German, English",        # HERE
    Nationality: "French",
    Hobby: "Developer, Hiking"                        # HERE
  },
]
 

каков был бы наилучший способ перебрать этот объект и преобразовать 3 поля programmingLanguage , LanguageSpoken и Hobby какие типы находятся string в списке (тип) строки.

итак, после преобразования это должно выглядеть так.

 const userData = 
  {
    id: 30,
    firstName: "James",
    lastName: "Anderson",
    programmingLanguage: ["Java", "Python"],         # List of strings
    LanguageSpoken: ["French", "German", "English"], # List of strings
    Nationality: "French",
    Hobby: ["Developer", "Hiking"]                   # List of strings         
  },
]
 

PS: (Я знаю, что это отстой) но приведенный выше формат — это способ, которым я получаю данные из серверной части, и поскольку мне не разрешено изменять это, я должен иметь с этим дело.

Если бы это было для одного поля, я бы сделал это:

   const transformedField = userData.programmingLanguage.toString().split(",");
  const resultTransformedField = transformedField.map((i) => Number(i));

  const newDataUser = {
    ...useData,
    programmingLanguage: resultTransformedField,
  };
 

но, как упоминалось выше, я должен изменить 3 поля.

Спасибо за помощь.

Ответ №1:

Я бы сопоставил каждый объект с новым объектом с помощью Object.fromEntries :

 const properties = ['programmingLanguage', 'LanguageSpoken', 'Hobby'];

const userData = [
  {
    id: 30,
    firstName: "James",
    lastName: "Anderson",
    programmingLanguage: "Java, Python",
    LanguageSpoken: "French, German, English",
    Nationality: "French",
    Hobby: "Developer, Hiking"
  },
];

const output = userData.map(
  obj => Object.fromEntries(
    Object.entries(obj).map(
      ([key, val]) => [key, properties.includes(key) ? val.split(', ') : val]
    )
  )
);
console.log(output); 

Комментарии:

1. Я вижу все больше и больше применений встроенной функции, которая не делает ничего больше, чем (obj, fn) => Object .fromEntries ( Object.entries (obj) .flatMap (([k, v]) => fn (k, v))) здесь, тогда было Object .rebuild (userData, (key, value) => [[key, properies.includes (key) ? val.split(', ') : val)]]) бы. (Массив результатов обратного вызова позволяет разделять или фильтровать входные данные, а не только однозначные результаты.) Я думаю, что действительно пора, по крайней мере, добавить это в Ramda. Например .