Хранение пар меток-значений массива фильтра по ключу в объекте (т. Е. В «карте» или «словаре»), а не в массиве, позволяет осуществлять поиск по ключу в постоянном времени (O (1)), чтобы обновить значение фильтр по ключу ( копирует и возвращает новое значение состояния OF C все еще O (n) ).
Кроме того, используйте обновление функционального состояния для правильного доступа к предыдущему состоянию и очереди обновления состояния.
const [filterValues, setFilterValues] = useState({ f1: ["l","v"] });
const handleChange = (filter, label, value) => {
setFilterValues(prevFilterValues => ({
...prevFilterValues, // copy previous state
[filter]: [label, value], // set the value for filter key
}));
};
Пример:
handleChange('f1', 'l1', 'v1');
// filterValues = { f1: ["l1", "v1"] }
handleChange('f2', 'l2', 'v2');
// filterValues = {
// f1: ["l1", "v1"],
// f2: ["l2", "v2"],
// }
handleChange('f1', 'l3', 'v3');
// filterValues = {
// f1: ["l3", "v3"],
// f2: ["l2", "v2"],
// }
Демонстрация:
//const [filterValues, setFilterValues] = useState({ f1: ["l","v"] });
// Manual mock for useState return values
let filterValues = { f1: ["l","v"] };
setFilterValues = stateUpdater => filterValues = stateUpdater(filterValues);
const handleChange = (filter, label, value) => {
setFilterValues(prevFilterValues => ({
...prevFilterValues, // copy previous state
[filter]: [label, value], // set the value for filter key
}));
};
// Start Demo
console.log('initial filterValues', filterValues); // { f1: ["l", "v"] }
handleChange('f1', 'l1', 'v1');
console.log('filterValues', filterValues); // { f1: ["l1", "v1"] }
handleChange('f2', 'l2', 'v2');
console.log('filterValues', filterValues); // { f1: ["l1", "v1"], f2: ["l2", "v2"] }
handleChange('f1', 'l3', 'v3');
console.log('filterValues', filterValues); // { f1: ["l3", "v3"], f2: ["l2", "v2"] }