#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. Например .