Let me know if this not appropriate to ask that here.
I'm currently building a react app with a map that has different markers (up to 1000) and they each have their specificity. A user can set different filters and the app should show the relevant one. I currently have an algorithm that works but I'm sure we can make it more efficient and less resource intensive.
Here is the code I have to far:
Will show just what's important.
To explain in the render I have a map where I display all the marker and under I have a list of all the filter where a user can click on it to apply this filter.
Thank you for your contribution!
class SomeComponent extends Component {
state = {
allMarkers: [
{id: "1", filter: ['weekout', 'restaurant'], latlng: {latitude: 37.78825, longitude: -122.4224},title:'42'},
{id: "2", filter: ['weekout'], latlng: {latitude: 37.78814, longitude: -122.4314},title:'Taverne du mont belon'},
{id: "3", filter: ['restaurant', 'party'], latlng: {latitude: 37.78825, longitude: -122.1224},title:'Chez Lapin'},
{id: "4", filter: ['party'], latlng: {latitude: 37.78825, longitude: -122.3324},title:'Pizza toto'},
// up to 1000
],
filteredMarkers: [
],
filters: [
{id: "1", selected: true, text: 'filter', filter: 'weekout'},
{id: "2", selected: true, text: 'filter', filter:'pin'},
{id: "3", selected: true, text: 'filter', filter: 'party'},
{id: "4", selected: true, text: 'filter', filter: 'restaurant'},
{id: "5", selected: false, text: 'filter', filter: 'beer'},
{id: "6", selected: true, text: 'filter', filter:'love'},
{id: "7", selected: false, text: 'filter', filter:'yum'},
],
}
filterMarkers() {
let activefilters = this.state.filters.map((item) => item.selected && item.filter);
let markers = this.state.allMarkers;
let filteredmarkers = markers.map((item) => activefilters
.some(r => item.filter.includes(r)) && item)
.filter((item) => item)
this.setState({...this.state, filteredMarkers: filteredmarkers})
}
selectedFilter(id) {
let selectedfilters = this.state.filters
selectedfilters.map((filter) => filter.id == id ? filter.selected = !filter.selected : null)
this.setState({...this.state, filters: selectedfilters})
this.filterMarkers();
}
render() {
return(
<View>
<MapView >
{this.state.filteredMarkers.map((marker, idx) => (
<Marker
key={idx}
identifier={marker.id}
coordinate={marker.latlng}
/>
))}
</MapView>
<FlatList
data={this.state.filters}
renderItem={({item, idx}) =>
<TouchableOpacity onPress={() => this.selectedFilter(item.id)}>
<View >
<Image source={item.img} idx={idx}/>
</View>
</TouchableOpacity>
}
/>
</View>
)
}
}
.some(r => item.filter.includes(r))is a good hint you should maybe be using a set.selectedfilters.mapshould beselectedfilters.forEach.