3

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!

2
  • Don't set state in a loop. const newState = { ...oldState }; test.forEach((item, i) => newState['item-' + i] = item); setState(newState); Commented Mar 16, 2020 at 16:01
  • I hope your example is more complicated than an object filled with keys of item-N, because you're essentially duplicating the functionality of an array :) Commented Mar 16, 2020 at 16:16

2 Answers 2

5

You can update the state using forEach() method like:

test.forEach((item, i) => {
   setState(state => ({...state, [`item-${i}`]: item}));
});
Sign up to request clarification or add additional context in comments.

Comments

1

You can use the functional version of set state and a reduce to accomplish 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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.