Array.prototype.some()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Phương thức some() của các đối tượng Array trả về true nếu tìm thấy ít nhất một phần tử trong mảng thỏa mãn hàm kiểm tra được cung cấp. Ngược lại, nó trả về false.
Try it
const array = [1, 2, 3, 4, 5];
// Checks whether an element is even
const even = (element) => element % 2 === 0;
console.log(array.some(even));
// Expected output: true
Cú pháp
some(callbackFn)
some(callbackFn, thisArg)
Tham số
callbackFn-
Hàm được thực thi cho mỗi phần tử trong mảng. Nó nên trả về một giá trị truthy để chỉ ra phần tử đã vượt qua bài kiểm tra, và một giá trị falsy trong trường hợp ngược lại. Hàm được gọi với các đối số sau:
thisArgOptional-
Giá trị dùng làm
thiskhi thực thicallbackFn. Xem phương thức lặp.
Giá trị trả về
false trừ khi callbackFn trả về một giá trị truthy cho một phần tử mảng, trong trường hợp đó true được trả về ngay lập tức.
Mô tả
Phương thức some() là một phương thức lặp. Nó gọi hàm callbackFn được cung cấp một lần cho mỗi phần tử trong mảng, cho đến khi callbackFn trả về một giá trị truthy. Nếu tìm thấy phần tử như vậy, some() lập tức trả về true và dừng lặp qua mảng. Ngược lại, nếu callbackFn trả về giá trị falsy cho tất cả các phần tử, some() trả về false. Đọc phần phương thức lặp để biết thêm thông tin về cách các phương thức này hoạt động nói chung.
some() hoạt động như lượng từ "tồn tại" trong toán học. Cụ thể, đối với mảng rỗng, nó trả về false cho bất kỳ điều kiện nào.
callbackFn chỉ được gọi cho các chỉ mục mảng đã được gán giá trị. Nó không được gọi cho các vị trí trống trong mảng thưa.
some() không thay đổi mảng mà nó được gọi trên, nhưng hàm được cung cấp là callbackFn có thể làm điều đó. Tuy nhiên, lưu ý rằng độ dài mảng được lưu lại trước lần gọi đầu tiên của callbackFn. Do đó:
callbackFnsẽ không ghé thăm bất kỳ phần tử nào được thêm vào ngoài độ dài ban đầu của mảng khi bắt đầu gọisome().- Các thay đổi đối với các chỉ mục đã được ghé thăm không khiến
callbackFnđược gọi lại trên chúng. - Nếu một phần tử hiện có, chưa được ghé thăm của mảng bị thay đổi bởi
callbackFn, giá trị của nó được truyền vàocallbackFnsẽ là giá trị tại thời điểm phần tử đó được ghé thăm. Các phần tử bị xóa sẽ không được ghé thăm.
Warning: Các thay đổi đồng thời kiểu như mô tả ở trên thường dẫn đến code khó hiểu và nên tránh (ngoại trừ các trường hợp đặc biệt).
Phương thức some() là phương thức tổng quát. Nó chỉ yêu cầu giá trị this có thuộc tính length và các thuộc tính có khóa là số nguyên.
Ví dụ
>Kiểm tra giá trị của các phần tử mảng
Ví dụ sau kiểm tra xem có phần tử nào trong mảng lớn hơn 10 không.
function isBiggerThan10(element, index, array) {
return element > 10;
}
[2, 5, 8, 1, 4].some(isBiggerThan10); // false
[12, 5, 8, 1, 4].some(isBiggerThan10); // true
Kiểm tra các phần tử mảng bằng hàm mũi tên
Hàm mũi tên cung cấp cú pháp ngắn hơn cho cùng bài kiểm tra.
[2, 5, 8, 1, 4].some((x) => x > 10); // false
[12, 5, 8, 1, 4].some((x) => x > 10); // true
Kiểm tra xem một giá trị có tồn tại trong mảng không
Để mô phỏng chức năng của phương thức includes(), hàm tùy chỉnh này trả về true nếu phần tử tồn tại trong mảng:
const fruits = ["apple", "banana", "mango", "guava"];
function checkAvailability(arr, val) {
return arr.some((arrVal) => val === arrVal);
}
checkAvailability(fruits, "grapefruit"); // false
checkAvailability(fruits, "banana"); // true
Chuyển đổi bất kỳ giá trị nào sang Boolean
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
Sử dụng đối số thứ ba của callbackFn
Đối số array hữu ích khi bạn muốn truy cập phần tử khác trong mảng, đặc biệt khi bạn không có biến hiện tại tham chiếu đến mảng. Ví dụ sau trước tiên dùng filter() để trích xuất các giá trị dương và sau đó dùng some() để kiểm tra xem mảng có tăng dần nghiêm ngặt không.
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
Sử dụng some() trên mảng thưa
some() sẽ không chạy hàm vị từ trên các vị trí trống.
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
Gọi some() trên đối tượng không phải mảng
Phương thức some() đọc thuộc tính length của this và sau đó truy cập từng thuộc tính có khóa là số nguyên không âm nhỏ hơn length cho đến khi tất cả được truy cập hoặc callbackFn trả về true.
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
Thông số kỹ thuật
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-array.prototype.some> |