I'm trying to change state, with values from array. Example:
const [state, setState] = useState({});
const test = [1, 2, 3];
test.map((item, i) => {
setState({ ...state, [`item-${i}`]: item });
});
Current state is:
item-2: 3
What I want to achieve is:
item-0: 1,
item-1: 2,
item-2: 3
I've tried to do it in several ways (all looking similar), but the effect is the same :/ does anyone knows how to resolve it?
Thanks!
I'm trying to change state, with values from array. Example:
const [state, setState] = useState({});
const test = [1, 2, 3];
test.map((item, i) => {
setState({ ...state, [`item-${i}`]: item });
});
Current state is:
item-2: 3
What I want to achieve is:
item-0: 1,
item-1: 2,
item-2: 3
I've tried to do it in several ways (all looking similar), but the effect is the same :/ does anyone knows how to resolve it?
Thanks!
const newState = { ...oldState }; test.forEach((item, i) => newState['item-' + i] = item); setState(newState);
– Jared Smith
Commented
Mar 16, 2020 at 16:01
item-N
, because you're essentially duplicating the functionality of an array :)
– Dan
Commented
Mar 16, 2020 at 16:16
You can update the state using forEach()
method like:
test.forEach((item, i) => {
setState(state => ({...state, [`item-${i}`]: item}));
});
You can use the functional version of set state and a reduce to acplish this:
setState(prevState => {
return test.reduce((acc, next, i) => {
return {
...acc,
[`item-${i}`]: next
},
}, prevState);
});
This has the advantage of doing it in a single call and is easier to read.