Josh
Josh

Reputation: 918

Javascript Find by this OR/ELSE find by this

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

Answers (2)

blex
blex

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

Anson Miu
Anson Miu

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

Related Questions