разбор вложенного массива javascript

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

  

Я уверен, что есть способ сделать это за меньшее количество строк, но это должно решить вашу проблему.