I have 4 dropdown multi-select filters in row.
Which need to render and on every selected option. I need to add that selected option in new array and update that current array -> object.property.selected = false/true.
I am searching trough array of objects, and one property of every object have array of objects.
You can found code example on this code-pen: https://codepen.io/nikolatrajkovicits/pen/JqpWOX?editors=0012
Here is how that array looks:
export const getFiltersList = () => [
{
title: 'Taxonomy',
options: [
{
id: 0,
name: 'Competitions',
selected: false,
key: 'Taxonomy'
},
{
id: 1,
name: 'Events',
selected: false,
key: 'Taxonomy'
},
{
id: 2,
name: 'Data',
selected: false,
key: 'Taxonomy'
},
{
id: 3,
name: 'Organisations',
selected: false,
key: 'Taxonomy'
},
{
id: 4,
name: 'Players',
selected: false,
key: 'Taxonomy'
},
{
id: 5,
name: 'Teams',
selected: false,
key: 'Taxonomy'
}
]
},
{
title: 'Source',
options: [
{
id: 0,
name: 'Facebook',
selected: false,
key: 'Source'
},
{
id: 1,
name: 'Twitter',
selected: false,
key: 'Source'
},
{
id: 2,
name: 'Instagram',
selected: false,
key: 'Source'
},
{
id: 3,
name: 'Websites',
selected: false,
key: 'Source'
}
]
},
{
title: 'Timeframe',
options: [
{
id: 0,
name: 'Past hour',
selected: false,
key: 'Timeframe'
},
{
id: 1,
name: 'Past 24 hours',
selected: false,
key: 'Timeframe'
},
{
id: 2,
name: 'Past week',
selected: false,
key: 'Timeframe'
},
{
id: 3,
name: 'Past month',
selected: false,
key: 'Timeframe'
},
{
id: 4,
name: 'Past year',
selected: false,
key: 'Timeframe'
}
]
},
{
title: 'Location',
options: [
{
id: 0,
name: 'Location 1',
selected: false,
key: 'Location'
},
{
id: 1,
name: 'Location 2',
selected: false,
key: 'Location'
},
{
id: 2,
name: 'Location 3',
selected: false,
key: 'Location'
},
{
id: 3,
name: 'Location 4',
selected: false,
key: 'Location'
}
]
}
];
Here is algorithm:
selectFilter = ({ id, key }) => {
const { filtersList, selectedFilters } = this.state;
const tempFilters = filtersList;
const tempSelected = selectedFilters;
const i = tempSelected.length;
tempFilters.forEach((filter) => {
if (filter.title === key) {
filter.options.forEach((option) => {
if (option.id === id) {
option.selected = !option.selected;
const isFilterExist = tempSelected.filter(
(selectedFilter) => selectedFilter.name === option.name
);
if (!isFilterExist.length) {
const selectedItem = { name: option.name, key, id };
tempSelected[i] = selectedItem;
}
}
});
}
});
this.setState({
filtersList: tempFilters,
selectedFilters: tempSelected
});
};
On code pen you can found version which is in pure javascript code.
How to make better cleaner faster search algo?
Any advice article, tutorial, comment?