#javascript #reactjs #ecmascript-6
#javascript #reactjs #ecmascript-6
Вопрос:
У меня есть этот массив
air_content: '',
compaction_method: 1,
concrete_cylinders: [
{
id: '',
specimen_name: 'A',
mould_number: '',
curing: 1,
age: 7
},
{
id: '',
specimen_name: 'A',
mould_number: '',
curing: 1,
age: 7
},
{
id: '',
specimen_name: 'A',
mould_number: '',
curing: 1,
age: 7
}
]
Я пытаюсь разобрать их при публикации данных (formik преобразует их обратно в текст, поэтому мне необходимо проанализировать их как int для моего серверной части)
Мой пост выглядит следующим образом (это работает, за исключением вложенных объектов, я также хочу, чтобы они анализировались как целочисленные)
axios.post('http://localhost:8123/samples/concrete', {
air_content: parseFloat(air_content),
compaction_method: parseInt(compaction_method),
concrete_cylinders
});
псевдоним / моя лучшая попытка кода того, что я пытаюсь сделать, — это приведенный ниже
axios.post('http://localhost:8123/samples/concrete', {
air_content: parseFloat(air_content),
compaction_method: parseInt(compaction_method),
concrete_cylinders: {
[concrete_cylinders.id]: parseInt(concrete_cylinders.id),
[concrete_cylinders.curing]: parseInt(concrete_cylinders.curing)
}
});
Спасибо за помощь
Комментарии:
1. в вопросе нет вложенного массива…
2. вложенный объект извиняется за concrete_cylinders
3. Все хорошо, я вроде как понял, что это то, с чем вы хотели иметь дело — см. Ответ
4. Если они числовые в объекте, как показано, то они должны оставаться числовыми при разборе в json
5. @charlietfl С formik происходит что-то странное, когда я каким-то образом устанавливаю для них числовое преобразование обратно в строку .. я много искал в Google и не могу найти решение
Ответ №1:
перед вызовом axios.post вам необходимо
concrete_cylinders.forEach(x => {
x.id = parseInt(x.id);
x.curing = parseInt(c.curing);
});
или, если вы действительно хотите, вы можете сделать это следующим образом
axios.post('http://localhost:8123/samples/concrete', {
air_content: parseFloat(air_content),
compaction_method: parseInt(compaction_method),
concrete_cylinders: concrete_cylinders.map(x => {
x.id = parseInt(x.id);
x.curing = parseInt(c.curing);
return x;
});
});
Ответ №2:
Вот версия, использующая более новый синтаксис распространения:
const concrete_cylinders = [
{
id: '',
specimen_name: 'A',
mould_number: '',
curing: '1',
age: '7'
},
{
id: '',
specimen_name: 'A',
mould_number: '',
curing: '1',
age: '7'
},
{
id: '',
specimen_name: 'A',
mould_number: '',
curing: '1',
age: '7'
}
]
const result = concrete_cylinders.map(o => ({
...o,
...{
curing: parseInt(o.curing),
age: parseInt(o.age)
}
}));
console.log(result);
Ответ №3:
Вы всегда можете попробовать использовать forEach
для массива перед публикацией. Так, например…
pojo = {
air_content: '',
compaction_method: 1,
concrete_cylinders: [
{
id: '3',
specimen_name: 'A',
mould_number: '',
curing: '1',
age: 7
},
{
id: '3',
specimen_name: 'A',
mould_number: '',
curing: '1',
age: 7
},
{
id: '3',
specimen_name: 'A',
mould_number: '',
curing: '1',
age: 7
}
]
}
pojo.concrete_cylinders.forEach(e => {
e.id = parseFloat(e.id)
e.curing = parseInt(e.curing)
//...anything else you want to change before posting
})
Затем передайте объект вашему axios.post
axios.post('http://localhost:8123/samples/concrete', pojo);
Я уверен, что есть способ сделать это за меньшее количество строк, но это должно решить вашу проблему.