Câu trả lời:
Không, nó không có. Vì lý do này, hầu hết các thư viện phổ biến đi kèm với một trong các gói tiện ích của họ. Kiểm tra các ví dụ inArray và Prototype của Array.indexOf của jQuery .
Việc triển khai jQuery của nó đơn giản như bạn mong đợi:
function inArray(needle, haystack) {
var length = haystack.length;
for(var i = 0; i < length; i++) {
if(haystack[i] == needle) return true;
}
return false;
}
Nếu bạn đang xử lý một lượng lớn các phần tử mảng, ở trên sẽ thực hiện thủ thuật độc đáo.
EDIT : Rất tiếc. Tôi thậm chí không nhận thấy bạn muốn xem nếu một mảng nằm trong một mảng khác. Theo tài liệu PHP, đây là hành vi dự kiến của PHP in_array
:
$a = array(array('p', 'h'), array('p', 'r'), 'o');
if (in_array(array('p', 'h'), $a)) {
echo "'ph' was found\n";
}
if (in_array(array('f', 'i'), $a)) {
echo "'fi' was found\n";
}
if (in_array('o', $a)) {
echo "'o' was found\n";
}
// Output:
// 'ph' was found
// 'o' was found
Mã được đăng bởi Chris và Alex không tuân theo hành vi này. Alex's là phiên bản chính thức của indexOf của Prototype và Chris giống với PHP hơn array_intersect
. Đây là những gì bạn muốn:
function arrayCompare(a1, a2) {
if (a1.length != a2.length) return false;
var length = a2.length;
for (var i = 0; i < length; i++) {
if (a1[i] !== a2[i]) return false;
}
return true;
}
function inArray(needle, haystack) {
var length = haystack.length;
for(var i = 0; i < length; i++) {
if(typeof haystack[i] == 'object') {
if(arrayCompare(haystack[i], needle)) return true;
} else {
if(haystack[i] == needle) return true;
}
}
return false;
}
Và đây là bài kiểm tra của tôi về những điều trên:
var a = [['p','h'],['p','r'],'o'];
if(inArray(['p','h'], a)) {
alert('ph was found');
}
if(inArray(['f','i'], a)) {
alert('fi was found');
}
if(inArray('o', a)) {
alert('o was found');
}
// Results:
// alerts 'ph' was found
// alerts 'o' was found
Lưu ý rằng tôi cố tình không mở rộng nguyên mẫu Array vì nói chung là một ý tưởng tồi để làm như vậy.
indexOf
w3schools.com/jsref/jsref_indexof_array.asp
Hiện tại có Array.prototype.includes
:
Phương thức include () xác định xem một mảng có bao gồm một phần tử nhất định hay không, trả về true hoặc false khi thích hợp.
var a = [1, 2, 3];
a.includes(2); // true
a.includes(4); // false
Cú pháp
arr.includes(searchElement)
arr.includes(searchElement, fromIndex)
Array.indexOf
đã được giới thiệu trong JavaScript 1.6, nhưng nó không được hỗ trợ trong các trình duyệt cũ hơn. Rất may, các lỗi trong Mozilla đã thực hiện tất cả công việc khó khăn cho bạn và cung cấp cho bạn điều này để tương thích:
if (!Array.prototype.indexOf)
{
Array.prototype.indexOf = function(elt /*, from*/)
{
var len = this.length >>> 0;
var from = Number(arguments[1]) || 0;
from = (from < 0)
? Math.ceil(from)
: Math.floor(from);
if (from < 0)
from += len;
for (; from < len; from++)
{
if (from in this &&
this[from] === elt)
return from;
}
return -1;
};
}
Thậm chí có một số đoạn sử dụng tiện dụng cho niềm vui kịch bản của bạn.
this.length >>> 0
gì? Đó có phải là một chuyển đổi sang một loại số?
Array.indexOf
hiện được chuẩn hóa bởi ECMAScript Fifth Edition, do đó, nên được coi là cách làm 'bản địa' thích hợp. Mặc dù vậy, bạn vẫn sẽ cần phải đánh hơi và cung cấp bản sao lưu này cho trình duyệt cũ hơn trong một thời gian dài. @harto: có, nó chuyển đổi this.length
thành Số có thể được biểu diễn dưới dạng số nguyên không dấu 32 bit. Một người bản địa Array
chỉ có thể có một độ dài đã tuân thủ điều này, nhưng thông số kỹ thuật nói rằng bạn có thể gọi Array.prototype
các phương thức trên các đối tượng JS gốc không có Array
. Điều này và các công cụ kiểm tra đối số phạm vi khác là để đảm bảo tuân thủ tuyệt đối.
Nếu các chỉ mục không theo trình tự hoặc nếu các chỉ mục không liên tiếp, mã trong các giải pháp khác được liệt kê ở đây sẽ bị hỏng. Một giải pháp có thể hoạt động tốt hơn có thể là:
function in_array(needle, haystack) {
for(var i in haystack) {
if(haystack[i] == needle) return true;
}
return false;
}
Và, như một phần thưởng, đây là tương đương với mảng_search của PHP (để tìm khóa của phần tử trong mảng:
function array_search(needle, haystack) {
for(var i in haystack) {
if(haystack[i] == needle) return i;
}
return false;
}
Có một dự án tên là Locutus , nó thực hiện các hàm PHP trong Javascript và in_array () được bao gồm, bạn có thể sử dụng chính xác như bạn sử dụng trong PHP.
Ví dụ sử dụng:
in_array('van', myArray);
in_array(1, otherArray, true); // Forcing strict type
Bạn chỉ có thể sử dụng chức năng "bao gồm" như được giải thích trong bài học này trên w3schools
nó có vẻ như
let myArray = ['Kevin', 'Bob', 'Stuart'];
if( myArray.includes('Kevin'))
console.log('Kevin is here');
var a = [1,2,3,4,5,6,7,8,9];
var isSixInArray = a.filter(function(item){return item==6}).length ? true : false;
var isSixInArray = a.indexOf(6)>=0;
Giải pháp jQuery đã có sẵn, hãy kiểm tra phần trích dẫn tại đây: http://api.jquery.com/jquery.inarray/
$.inArray( 10, [ 8, 9, 10, 11 ] );
Có một chức năng tương đương:
includes()
Xem tại đây: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
Nếu bạn chỉ muốn kiểm tra xem một giá trị có nằm trong một mảng hay không, thì mã của Paolo sẽ thực hiện công việc. Nếu bạn muốn kiểm tra giá trị nào là phổ biến cho cả hai mảng, thì bạn sẽ muốn một cái gì đó như thế này (sử dụng hàm inArray của Paolo):
function arrayIntersect(a, b) {
var intersection = [];
for(var i = 0; i < a.length; i++) {
if(inArray(b, a[i]))
intersection.push(a[i]);
}
return intersection;
}
Điều này sẽ trả về một loạt các giá trị nằm trong cả hai a
và b
. (Về mặt toán học, đây là giao điểm của hai mảng.)
EDIT: Xem Mã chỉnh sửa của Paolo để biết giải pháp cho vấn đề của bạn. :)
Nếu bạn cần tất cả các tham số có sẵn của PHP , hãy sử dụng:
function in_array(needle, haystack, argStrict) {
var key = '', strict = !!argStrict;
if (strict) {
for (key in haystack) {
if (haystack[key] === needle) {
return true;
}
}
}
else {
for (key in haystack) {
if (haystack[key] == needle) {
return true;
}
}
}
return false;
}
Với Bộ công cụ Dojo , bạn sẽ sử dụng dojo.indexOf()
. Xem dojo.indexOf để biết tài liệu và Mảng được thực hiện dễ dàng bởi Bryan Forbes để biết một số ví dụ.
haystack.find(value => value == needle)
trong đó haystack là một mảng và kim là một yếu tố trong mảng. Nếu phần tử không tìm thấy sẽ được trả về không xác định khác phần tử tương tự.
Nếu bạn sẽ sử dụng nó trong một lớp và nếu bạn thích nó hoạt động (và hoạt động trong tất cả các trình duyệt):
inArray: function(needle, haystack)
{
var result = false;
for (var i in haystack) {
if (haystack[i] === needle) {
result = true;
break;
}
}
return result;
}
Hy vọng nó sẽ giúp được ai đó :-)
jQuery.inArray()
không không trở boolean. Nó trả về chỉ mục của phần tử được tìm thấy hoặc -1 nếu không tìm thấy