Reputation: 4712
I am working on a small Svelte application, for learning purposes (Im new to Svelte).
The application displays a JSON of countries in a Bootstrap 4 table. There is also a text box that can be used to filter through the countries:
const apiURL = "https://gist.githubusercontent.com/Goles/3196253/raw/9ca4e7e62ea5ad935bb3580dc0a07d9df033b451/CountryCodes.json";
let countries = [];
let filteredCountries = [];
let stringToMatch = '';
onMount(async function() {
const response = await fetch(apiURL);
countries = await response.json();
filteredCountries = countries;
});
function filterList(){
filteredCountries = countries;
if(stringToMatch){
filteredCountries = countries.filter(country => {
return country.name.toLowerCase().includes(stringToMatch.toLowerCase()) || country.code.includes(stringToMatch.toUpperCase());
});
}
}
See a REPL with the entire code HERE.
I am looking for a way to filter through the countries
array and return it filtered, instead of using JavaScript's filter()
method which requires storing the results in another variable.
In other words, I wish I would not need the filteredCountries
variable.
Is that possible? How?
Upvotes: 1
Views: 1995
Reputation: 14873
An idea would be to use an getFilteredCountries()
function so you don't need this filteredCountries
variable.
You can define it like that:
function getFilteredCountries(countries, stringToMatch){
if(stringToMatch){
return countries.filter(country => {
return country.name.toLowerCase().includes(stringToMatch.toLowerCase()) || country.code.includes(stringToMatch.toUpperCase());
});
} else {
return countries
}
}
and consume it in your #each
:
{#each getFilteredCountries(countries, stringToMatch) as country}
<tr>
<td>{country.name}</td>
<td class="text-right">{country.code}</td>
</tr>
{/each}
See a REPL with the entire code HERE.
Upvotes: 3