-1

I have a form with dynamically created inputs. The number of inputs and their name changes depending on fetched data. I'd like to create an array of objects from the values I get from those inputs.

const [form, setForm] = useState([]);
packages = ["250g", "500g"] //This varies depending on fetched data

HTML:

<form onSubmit={(e) => handleSubmit(e)}>
            <ul>
                {packages.map((packageName, index) => {
                    return (
                        <li key={index}>
                            <p>{packageName}</p>
                            <input type="number" min={0} value={form[packageName]} onChange={(e) => handleChange(e, packageName)} />
                            <button type="submit">BUY</button>
                        </li>
                    );
                })}
            </ul>
        </form>

handleChange function:

const handleChange = (e, packageName) => {
    setForm([...form, { [packageName]: parseInt(e.target.value) }]);
};

Current output:

form: [
    {
       "250g": 1
    },
    {
       "250g": 2
    },
    {
       "250g": 3
    },
    {
       "500g": 1
    },
    {
       "500g": 2
    }

]

Every change in input value creates a new object, but I'd like to just change the value in that particular object, that is changed currently.

Desired output:

form: {
    "250g": { quantity: 3 },
    "500g": { quantity: 2 }
}
TopW3
  • 1,477
  • 1
  • 8
  • 14
MadGrip
  • 391
  • 4
  • 17

2 Answers2

0

You can use an object instead of array.

const [form, setForm] = useState({});

const handleChange = (e, packageName) => {
    setForm({
         ...form,
         [packageName]: { quantity: parseInt(e.target.value) }
    });
}
TopW3
  • 1,477
  • 1
  • 8
  • 14
0

I'm pasting a vanilla js sample executable.

   let form = {}

function add(str) {
 if (form[str]) {
  form[str].quantity += 1
 } else {
  form[str] = { quantity: 1}
 }
}

add("250g")
add("250g")
add("250g")
add("750g")
add("500g")
add("750g")

console.log(form)

So i guess your method will become like this

const handleChange = (e, packageName) => {
  let newForm = JSON.parse(JSON.stringify(form))
  
     if (newForm[packageName]) {
      newForm[packageName].quantity += parseInt(e.target.value)
       setForm(newForm);
     } else {
            setForm({
         ...form,
         [packageName]: { quantity: parseInt(e.target.value) }
     }  
}
Apostolos
  • 10,033
  • 5
  • 24
  • 39