Array.prototype.some()

基线 广泛可用

此功能已得到良好建立,并在许多设备和浏览器版本上都能正常工作。自以下时间起,它已在浏览器中普遍可用: 2015 年 7 月.

some() 方法是 Array 实例的方法,用于测试数组中是否存在至少一个元素通过提供的函数实现的测试。如果在数组中找到一个元素,其提供的函数返回 true,则返回 true;否则返回 false。它不会修改数组。

试一试

语法

js
some(callbackFn)
some(callbackFn, thisArg)

参数

callbackFn

要对数组中的每个元素执行的函数。它应该返回一个 真值 以指示元素通过测试,否则返回一个 假值。该函数使用以下参数调用

元素

数组中正在处理的当前元素。

索引

数组中正在处理的当前元素的索引。

数组

some() 被调用的数组。

thisArg 可选

在执行 callbackFn 时用作 this 的值。请参阅 迭代方法

返回值

false,除非 callbackFn 对数组元素返回一个 真值,在这种情况下,会立即返回 true

描述

some() 方法是一个 迭代方法。它对数组中的每个元素调用提供的 callbackFn 函数一次,直到 callbackFn 返回一个 真值。如果找到这样的元素,some() 会立即返回 true 并停止遍历数组。否则,如果 callbackFn 对所有元素都返回一个 假值,则 some() 返回 false。阅读 迭代方法 部分,以获取有关这些方法如何普遍工作的更多信息。

some() 类似于数学中的“存在”量词。特别是,对于空数组,它对任何条件都返回 false

callbackFn 仅对已分配值的数组索引调用。它不会对 稀疏数组 中的空插槽调用。

some() 不会改变其被调用的数组,但作为 callbackFn 提供的函数可以改变。但是,请注意,数组的长度是在 callbackFn 的第一次调用之前保存的。因此

  • 当调用 some() 开始时,callbackFn 不会访问添加到数组初始长度之外的任何元素。
  • 对已访问索引的更改不会导致 callbackFn 再次在它们上调用。
  • 如果 callbackFn 更改了数组中现有的但尚未访问的元素,则传递给 callbackFn 的其值将是在访问该元素时该元素的值。已删除 的元素不会被访问。

警告: 上述类型的并发修改通常会导致难以理解的代码,并且通常应避免(除非在特殊情况下)。

some() 方法是 泛型 的。它只期望 this 值具有 length 属性和整数键属性。

示例

测试数组元素的值

以下示例测试数组中是否存在任何元素大于 10。

js
function isBiggerThan10(element, index, array) {
  return element > 10;
}

[2, 5, 8, 1, 4].some(isBiggerThan10); // false
[12, 5, 8, 1, 4].some(isBiggerThan10); // true

使用箭头函数测试数组元素

箭头函数 为相同的测试提供了更短的语法。

js
[2, 5, 8, 1, 4].some((x) => x > 10); // false
[12, 5, 8, 1, 4].some((x) => x > 10); // true

检查数组中是否存在值

为了模仿 includes() 方法的功能,此自定义函数在元素存在于数组中时返回 true

js
const fruits = ["apple", "banana", "mango", "guava"];

function checkAvailability(arr, val) {
  return arr.some((arrVal) => val === arrVal);
}

checkAvailability(fruits, "kela"); // false
checkAvailability(fruits, "banana"); // true

将任何值转换为布尔值

js
const TRUTHY_VALUES = [true, "true", 1];

function getBoolean(value) {
  if (typeof value === "string") {
    value = value.toLowerCase().trim();
  }

  return TRUTHY_VALUES.some((t) => t === value);
}

getBoolean(false); // false
getBoolean("false"); // false
getBoolean(1); // true
getBoolean("true"); // true

使用 callbackFn 的第三个参数

如果您想访问数组中的另一个元素,array 参数很有用,尤其是在您没有引用该数组的现有变量时。以下示例首先使用 filter() 提取正值,然后使用 some() 检查数组是否严格递增。

js
const numbers = [3, -1, 1, 4, 1, 5];
const isIncreasing = !numbers
  .filter((num) => num > 0)
  .some((num, idx, arr) => {
    // Without the arr argument, there's no way to easily access the
    // intermediate array without saving it to a variable.
    if (idx === 0) return false;
    return num <= arr[idx - 1];
  });
console.log(isIncreasing); // false

在稀疏数组上使用 some()

some() 不会在其谓词上运行空插槽。

js
console.log([1, , 3].some((x) => x === undefined)); // false
console.log([1, , 1].some((x) => x !== 1)); // false
console.log([1, undefined, 1].some((x) => x !== 1)); // true

在非数组对象上调用 some()

some() 方法读取 thislength 属性,然后访问每个键为小于 length 的非负整数的属性,直到所有属性都被访问或 callbackFn 返回 true

js
const arrayLike = {
  length: 3,
  0: "a",
  1: "b",
  2: "c",
  3: 3, // ignored by some() since length is 3
};
console.log(Array.prototype.some.call(arrayLike, (x) => typeof x === "number"));
// false

规范

规范
ECMAScript 语言规范
# sec-array.prototype.some

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。

另请参阅