some()

The JavaScript some() method will loop over an array and run a provided function for each array item. If the result of the function is true for at least one element in the array, a true value is returned, otherwise false. The original array is unmodified, and once a match is found the iteration will stop.

Syntax

const result = array.some(function(currentValue, index, array) {
  // return true if the condition is met for at least one element
});

Parameters:

  • function: Function that tests each element of the array, taking three possible arguments:
    • currentValue: The current element being processed.
    • index (optional): The index of the current element.
    • array (optional): The original array some() was called upon.

Basic usage

Let's check if our pizza toppings array contains any controversial options:

const pizzaToppings = ['Cheese', 'Pepperoni', 'Mushrooms', 'Olives', 'Anchovies', 'Pineapple'];

// Check if any controversial toppings are present
const hasControversialToppings = pizzaToppings.some(topping => {
  return topping === 'Anchovies' || topping === 'Pineapple';
});

console.log(hasControversialToppings);
// Output: true (because 'Anchovies' and 'Pineapple' are present)

Check if any topping starts with 'P':

const pizzaToppings = ['Cheese', 'Pepperoni', 'Mushrooms', 'Olives', 'Anchovies', 'Pineapple'];

const hasPTopping = pizzaToppings.some(topping => topping.startsWith('P'));
console.log(hasPTopping);
// Output: true (because 'Pepperoni' and 'Pineapple' start with 'P')

Here's an example checking if any topping name is very short:

const pizzaToppings = ['Cheese', 'Pepperoni', 'Mushrooms', 'Olives', 'Ham', 'Pineapple'];

// Check if any topping has a name shorter than 4 characters
const hasShortName = pizzaToppings.some(topping => {
  return topping.length < 4;
});

console.log(hasShortName);
// Output: true (because 'Ham' has length 3)

Using the index parameter

The second parameter gives access to the current index. Let's check if any topping at an odd index is 'Olives'.

const pizzaToppings = ['Cheese', 'Pepperoni', 'Mushrooms', 'Olives', 'Anchovies', 'Pineapple'];

// Check if 'Olives' exists at an odd index
const hasOlivesAtOddIndex = pizzaToppings.some((topping, index) => {
  return index % 2 !== 0 && topping === 'Olives';
});

console.log(hasOlivesAtOddIndex);
// Output: true (because 'Olives' is at index 3)

The function can also be extracted, allowing it to be re-used and improving readability:

const pizzaToppings = ['Cheese', 'Pepperoni', 'Mushrooms', 'Olives', 'Anchovies', 'Pineapple'];

const isMeat = (topping) => {
  const meatToppings = ['Pepperoni', 'Anchovies', 'Bacon', 'Sausage', 'Ham'];
  return meatToppings.includes(topping);
}

// Check if the list contains any meat toppings
const hasMeatToppings = pizzaToppings.some(isMeat);

console.log(hasMeatToppings);
// Output: true (because 'Pepperoni' and 'Anchovies' are present)

Using the array parameter

The third parameter provides a reference to the original array. This isn't commonly needed with some() but can be used for complex checks requiring the original array.

const pizzaOrders = [
  { type: "Margherita", price: 8 },
  { type: "BBQ Chicken", price: 15 },
  { type: "Veggie", price: 9 },
];

// Check if any order costs more than half the price of the most expensive order in the list
const hasRelativelyExpensiveOrder = pizzaOrders.some((order, index, originalArray) => {
  // Find the max price in the array first
  const maxPrice = Math.max(...originalArray.map(o => o.price));
  console.log(`Checking order: ${order.type} ($${order.price}), Max price: $${maxPrice}`);

  // Check if the current order's price is more than half the max price
  return order.price > maxPrice / 2;
});

console.log("Is there any order costing more than half the max price?", hasRelativelyExpensiveOrder);
// Output: Is there any order costing more than half the max price? true (BBQ Chicken at $15 is > $15/2)

Working with objects in arrays

The some() method is useful for checking conditions within arrays of objects.

const pizzaMenu = [
  { name: 'Margherita', price: 10, isVegetarian: true },
  { name: 'Pepperoni', price: 12, isVegetarian: false },
  { name: 'Vegetarian', price: 13, isVegetarian: true },
  { name: 'Supreme', price: 15, isVegetarian: false },
  { name: 'Hawaiian', price: 12, isVegetarian: false }
];

// Check if there are any vegetarian pizzas on the menu
const hasVegetarianOptions = pizzaMenu.some(pizza => pizza.isVegetarian);
console.log("Does the menu have vegetarian options?", hasVegetarianOptions);
// Output: Does the menu have vegetarian options? true

// Check if any pizza costs more than $14
const hasExpensivePizza = pizzaMenu.some(pizza => pizza.price > 14);
console.log("Does the menu have any pizza over $14?", hasExpensivePizza);
// Output: Does the menu have any pizza over $14? true (Supreme)

// Check if there's a pizza named 'Spicy Meat Feast'
const hasSpicyMeatFeast = pizzaMenu.some(pizza => pizza.name === 'Spicy Meat Feast');
console.log("Is 'Spicy Meat Feast' on the menu?", hasSpicyMeatFeast);
// Output: Is 'Spicy Meat Feast' on the menu? false

Chaining some()

While methods like filter() and map() return new arrays and are often chained, some() returns a boolean. Therefore, you typically don't chain after some(). However, you might use some() within the callback of another method like filter().

const pizzaStores = [
  {
    name: "Store 1",
    pizzas: [
      { name: "Margherita", price: 10, isVegetarian: true },
      { name: "Pepperoni", price: 12, isVegetarian: false }
    ]
  },
  {
    name: "Store 2",
    pizzas: [
      { name: "Vegetarian", price: 13, isVegetarian: true },
      { name: "Hawaiian", price: 12, isVegetarian: false }
    ]
  },
   {
    name: "Store 3",
    pizzas: [
      { name: "Pepperoni", price: 11, isVegetarian: false },
      { name: "Hawaiian", price: 13, isVegetarian: false }
    ]
  }
];

// Find stores that offer at least one vegetarian option using filter() and some()
const storesWithVegetarian = pizzaStores.filter(store => {
  // Use some() inside the filter callback
  return store.pizzas.some(pizza => pizza.isVegetarian);
});

console.log("Stores with vegetarian options:", storesWithVegetarian.map(store => store.name));
// Output: Stores with vegetarian options: ["Store 1", "Store 2"]

Practical example: checking inventory

const pizzaInventory = [
  { name: 'Dough', quantity: 50, needsRestock: false },
  { name: 'Cheese', quantity: 20, needsRestock: false },
  { name: 'Pepperoni', quantity: 5, needsRestock: true }, // Low stock!
  { name: 'Mushrooms', quantity: 15, needsRestock: false }
];

// Check if any ingredient needs restocking
const needsRestocking = pizzaInventory.some(item => item.needsRestock);
console.log("Does any ingredient need restocking?", needsRestocking);
// Output: Does any ingredient need restocking? true

// Check if any ingredient has quantity less than 10
const lowStockExists = pizzaInventory.some(item => item.quantity < 10);
console.log("Is any ingredient stock below 10 units?", lowStockExists);
// Output: Is any ingredient stock below 10 units? true (Pepperoni)

When to use some() vs. other methods

Use some() when:

  • You need to know if at least one element in an array meets a specific test.
  • Only a true or false value is required, not a new array or a specific element.
  • Performance matters for large arrays, as some() stops iterating as soon as it finds a match.

Consider using other methods when:

  • You need to transform each element (use map()).
  • You require all elements match a condition (use every()).
  • You require a new array containing elements that match a condition (use filter()).
  • You need to perform an action for each element (use forEach()).
  • You need to find the first element that matches a condition (use find()).
  • You need to accumulate a single value from the array (use reduce()).

Conclusion

The some() method provides an efficient way to check for at least one element in an array that satisfies a given condition. It returns a simple boolean (true or false), making it ideal for conditional logic based on array contents without needing to iterate through the entire array once a match is found.