Remove an Item from an Array
Solutions
Solution 1 (Click to Show/Hide)
const immutableReducer = (state = [0, 1, 2, 3, 4, 5], action) => {
switch (action.type) {
case "REMOVE_ITEM":
// don't mutate state here or the tests will fail
return [
...state.slice(0, action.index),
...state.slice(action.index + 1, state.length)
];
// or return state.slice(0, action.index).concat(state.slice(action.index + 1, state.length));
default:
return state;
}
};
const removeItem = index => {
return {
type: "REMOVE_ITEM",
index
};
};
const store = Redux.createStore(immutableReducer);
Code Explanation
- array.slice(fromIndex, untilIndex) returns a new array
- 1st slice from the first item’s index (0 inclusive) until indexToRemove(action.index exclusive)
- 2nd slice from item right after indexToRemove (action.index + 1 inclusive) until length (last item’s index + 1 exclusive)
- since slice returns a new array, combine both parts with […array1, …array2] spread operator
- or combine them with .concat()
Solution 2 (Click to Show/Hide)
const immutableReducer = (state = [0, 1, 2, 3, 4, 5], action) => {
switch (action.type) {
case 'REMOVE_ITEM':
// Don't mutate state here or the tests will fail
return state.filter((_, index) => index !== action.index);
default:
return state;
}
};
const removeItem = (index) => {
return {
type: 'REMOVE_ITEM',
index
}
}
const store = Redux.createStore(immutableReducer);
Code Explanation
Using the index on the action and the index from Array.prototype.filter() to filter out the element.