Изменить объект в массиве, если найден по идентификатору

#reactjs #redux #react-redux

#reactjs #redux #реагировать-redux

Вопрос:

Согласно шаблонам проектирования Redux, если вы хотите изменить объект в массиве, вы должны использовать state.items.map , но можно ли использовать array.findIndex и, если элемент не найден, вернуть старое состояние? Это плохая практика, если да, то почему?

  1. Метод Redux pattern. Метод возвращает новое состояние, даже если комната не найдена.


    const roomId = action.payload.room.id;
    const roomsList = state.roomsList.map(room => {
    if (room.id === roomId) {
    return action.payload.room;
    } else {
    return room;
    }
    });
    return {
    ...state,
    roomsList,
    };

  2. Второй способ, который мне нравится больше. Метод возвращает новое состояние, только если найдена комната с заданным идентификатором


    const roomId = action.payload.room.id;
    const idx = state.roomsList.findIndex(room => room.id === roomId);
    if(idx!==-1) {
    const roomsList = Array.from(state.roomsList);
    roomsList[idx] = action.payload.room;
    return {
    ...state,
    roomsList,
    };
    }else{
    return state;
    }

Ответ №1:

Всегда можно вернуть предыдущее состояние, если редуктор не вносил никаких изменений.

Это то, что в default случае обычно выполняется в обычной switch функции-редукторе, как в примере из официальных redux документов.