Reputation: 918
Is there a cleaner way to find the first value in an array that matches a condition and if that value isn't found, try a different value?
const animals = ['cat', 'dog', 'bird', 'snake'];
let favoriteAnimal = animals.find(animal => animal === 'cat');
if (!favoriteAnimal) favoriteAnimal = animals.find(animal => animal === 'dog');
Updated my question a bit. If 'cat' isn't in the array, then look for 'dog'. If 'cat' or 'dog' are not found, just return undefined.
Upvotes: 1
Views: 381
Reputation: 25659
If you're only looking for string values, you could do this:
const animals = ['dog', 'bird', 'snake'];
const animalsToTry = ['cat', 'dog'];
let favoriteAnimal = animalsToTry.find(animal => animals.includes(animal));
console.log(favoriteAnimal); // 'dog'
And if you're looking to match objects based on a property:
const animals = [{id: 'dog'}, {id: 'bird'}, {id: 'snake'}];
function findFirstMatchingAnimal(animals, animalIds) {
for (let id of animalIds) {
const animal = animals.find(a => a.id === id);
if (animal) return animal;
}
}
console.log(findFirstMatchingAnimal(animals, ['cat', 'dog'])); // { id: 'dog' }
console.log(findFirstMatchingAnimal(animals, ['bird', 'dog'])); // { id: 'bird' }
console.log(findFirstMatchingAnimal(animals, ['cow', 'monkey'])); // undefined
Upvotes: 4
Reputation: 1171
Assuming your list of keys (favourites
) is ordered from high to low "priority", you could iteratively find the favouriteAnimal
from the list of animals
,
function findFavourite(animals, favourites) {
// assume that `favourites` is ordered from highest to lowest "priority"
for (const favourite of favourites) {
if (animals.includes(favourite)) {
return favourite;
}
}
return null;
}
const animals = ['dog', 'bird', 'snake'];
console.log(findFavourite(animals, ['cat', 'dog'])); // 'dog'
console.log(findFavourite(animals, ['cat', 'bird', 'dog'])); // 'bird'
console.log(findFavourite(animals, ['cat', 'mouse'])); // null
Upvotes: 1