Ola Kozioł
Ola Kozioł

Reputation: 95

ReactJS, Hooks - How to setState after .map() function?

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!

Upvotes: 3

Views: 3950

Answers (2)

Dan
Dan

Reputation: 10538

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.

Upvotes: 1

palaѕн
palaѕн

Reputation: 73896

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

test.forEach((item, i) => {
   setState(state => ({...state, [`item-${i}`]: item}));
});

Upvotes: 5

Related Questions