当你在 JavaScript 中处理数组时,有时你可能只想检查该数组中是否至少有一个元素通过了测试。而且你可能不关心任何其他后续匹配。

在这种情况下,你应该使用 JavaScript some() 方法。那么让我们看看它是如何工作的。

如何使用 JavaScript Array.some() 方法

some() 方法是一个 Array.propotype(内置)方法,它接受一个回调函数,并将在每次迭代时针对当前项目测试该函数。

如果数组中的任何元素通过回调中指定的测试,则该方法将停止迭代并返回 true。如果没有元素通过测试,则该方法返回 false

该方法接受三个参数:

  • currentItem:这是当前正在迭代的数组内部的元素
  • index:这是数组内 currentItem 的索引位置
  • array:这表示 some() 方法绑定到的数组集合

理解 Array.some() 方法背后的主要思想的一种简单方法是考虑我们作为人类的最大倾向之一:泛化。人们倾向于仅基于一种单一的体验或感知进行概括。

例如,如果来自某个地方的某个人以某种方式行事,那么很多人会假设来自该地方的每个人也以同样的方式行事,即使这样的假设仅基于一次经验。

some() 方法在找到一个匹配项的那一刻就返回 true

如何在 JavaScript 中使用 Array.some()

在以下示例中,我们将实际了解如何在 JavaScript 中使用 some() 方法。

如何使用 some() 测试至少一个匹配

在这个例子中,我们将检查 people 数组中是否至少有一个男性。

let people = [{
    name: "Anna",
    sex: "Female"
  },

  {
    name: "Ben",
    sex: "Male"
  },

  {
    name: "Cara",
    sex: "Female"
  },
  
  {
    name: "Danny",
    sex: "Female"
  }
  
]


function isThereMale(person) {
	return person.sex === "Male"
}

console.log(people.some(person => isThereMale(person)) // true

由于确实存在一个男性,因此 some() 方法返回 true

即使我们在数组中定义了两个男性,该方法仍然会返回 true。该方法不关心是否有第二个男性,它只关心第一个。

let people = [{
    name: "Anna",
    sex: "Female"
  },

  {
    name: "Ben",
    sex: "Male"
  },

  {
    name: "Cara",
    sex: "Female"
  },
  
  {
    name: "Danny",
    sex: "Female"
  },
  
  {
    name: "Ethan",
    sex: "Male"
  }
  
]


function isThereMale(person) {
	return person.sex === "Male"
}

console.log(people.some(person => isThereMale(person)) // true

如果数组中的所有项都未通过回调测试,则 some() 方法将返回 false

在这个例子中,由于我们的 people 数组中没有男性,因此将返回 false

let people = [{
    name: "Anna",
    sex: "Female"
  },

  {
    name: "Bella",
    sex: "Female"
  },

  {
    name: "Cara",
    sex: "Female"
  },
  
  {
    name: "Danny",
    sex: "Female"
  },
  
  {
    name: "Ella",
    sex: "Female"
  }
  
]


function isThereMale(person) {
		return person.sex === "Male"
}

console.log(people.some(person => isThereMale(person))) // false

如何在 some() 中使用索引参数

some() 中定义的回调函数可以访问被迭代的每个项目的索引(index)属性。索引只是一个数值,唯一标识数组中每个元素的位置。这样,你可以通过索引引用数组中的任何元素。

在这里,我们使用索引值来构造我们登录到控制台的消息:

let people = [{
    name: "Anna",
    sex: "Female"
  },

  {
    name: "Ben",
    sex: "Male"
  },

  {
    name: "Cara",
    sex: "Female"
  },
  
  {
    name: "Danny",
    sex: "Female"
  },
  
  {
    name: "Ethan",
    sex: "Male"
  }
  
]


function isThereMale(person, index) {
		if (person.sex === "Male") console.log(`No ${index+1}, which is ${person.name}, is a Male`)
		return person.sex === "Male"
}

console.log(people.some((person, index) => isThereMale(person, index)))

/* 
"No 2, which is Ben, is a Male"

true
*/

如何在 some() 中使用上下文对象

除了回调函数,some() 还可以接收上下文对象。

some(callbackFn, contextObj)

然后我们可以在每次迭代时从回调函数内部引用对象,使用 this 作为引用。这允许我们访问上下文对象中定义的任何属性或方法。

将上下文对象与 some() 结合使用的示例

在此示例中,我们希望检查 people 数组中是否至少有一个人的年龄介于 30 和 39 之间。

我们可以在 conditions 对象中定义规则,然后使用 this.property 从回调函数内部访问它。然后我们执行检查以确定是否至少有一个人符合条件。

let people = [{
    name: "Anna",
    age: 20
  },

  {
    name: "Ben",
    age: 35
  },

  {
    name: "Cara",
    age: 8
  },
  
  {
    name: "Danny",
    age: 17
  },
  
  {
    name: "Ethan",
    age: 28
  }
  
]

let conditions = {
	lowerAge: 30,
  upperAge: 39
}



console.log(people.some(person => function(person) {
	return person.age >= this.lowerAge && person.age <= this.upperAge
}, conditions)) // true

由于一个人(Ben)在该范围内,some() 将返回 true

总结

some() 方法是一个 Array.prototype 方法,它接受一个回调函数并为绑定数组中的每个项目调用该函数。

当项目通过回调测试时,该方法将返回 true 并停止循环。否则,它返回 false

除了回调函数之外,some() 方法还可以将上下文对象作为第二个参数。这将使你能够使用 this 从回调函数访问其任何属性。

我希望你从这篇文章中得到一些有用的东西。

如果你想了解更多 Web 开发知识,欢迎访问我的博客和我的电子书

感谢阅读!

原文:JavaScript Array.some() Tutorial – How to Iterate Through Elements in an Array,作者:Kingsley Ubah