Apakah ada cara dalam JavaScript untuk membandingkan nilai dari satu array dan melihat apakah ada di array lain?
Mirip dengan in_array
fungsi PHP ?
Apakah ada cara dalam JavaScript untuk membandingkan nilai dari satu array dan melihat apakah ada di array lain?
Mirip dengan in_array
fungsi PHP ?
Jawaban:
Tidak, tidak ada. Untuk alasan ini, sebagian besar pustaka populer datang dengan satu dalam paket utilitas mereka. Lihat inArray jQuery dan Prototype Array.indexOf untuk contoh.
Implementasi jQuery terhadapnya sesederhana yang Anda harapkan:
function inArray(needle, haystack) {
var length = haystack.length;
for(var i = 0; i < length; i++) {
if(haystack[i] == needle) return true;
}
return false;
}
Jika Anda berurusan dengan jumlah elemen array yang waras di atas akan melakukan trik dengan baik.
EDIT : Whoops. Saya bahkan tidak memperhatikan Anda ingin melihat apakah array ada di dalam array lain. Menurut dokumentasi PHP ini adalah perilaku yang diharapkan dari 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
Kode yang diposting oleh Chris dan Alex tidak mengikuti perilaku ini. Alex adalah versi resmi dari indeks Prototipe, dan Chris lebih mirip PHP array_intersect
. Ini melakukan apa yang Anda inginkan:
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;
}
Dan ini ujian saya di atas:
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
Perhatikan bahwa saya sengaja tidak memperpanjang prototipe Array karena umumnya merupakan ide yang buruk untuk melakukannya.
indexOf
w3schools.com/jsref/jsref_indexof_array.asp
Sekarang ada Array.prototype.includes
:
Metode include () menentukan apakah array menyertakan elemen tertentu, mengembalikan benar atau salah yang sesuai.
var a = [1, 2, 3];
a.includes(2); // true
a.includes(4); // false
Sintaksis
arr.includes(searchElement)
arr.includes(searchElement, fromIndex)
Array.indexOf
diperkenalkan di JavaScript 1.6, tetapi tidak didukung di browser yang lebih lama. Untungnya bab-bab di Mozilla telah melakukan semua kerja keras untuk Anda, dan memberi Anda ini untuk kompatibilitas:
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;
};
}
Bahkan ada beberapa cuplikan penggunaan yang berguna untuk kesenangan penulisan Anda.
this.length >>> 0
? Apakah itu konversi ke jenis Angka?
Array.indexOf
sekarang distandarisasi oleh ECMAScript Fifth Edition sehingga harus dianggap sebagai cara 'asli' yang tepat untuk melakukannya. Anda masih perlu mengendus dan menyediakan cadangan ini untuk browser yang lebih lama untuk waktu yang lama. @harto: ya, itu dikonversi this.length
ke Nomor yang dapat direpresentasikan sebagai integer 32-bit yang tidak ditandatangani. Asli Array
hanya dapat memiliki panjang yang sudah sesuai dengan ini, tetapi spesifikasi menyatakan bahwa Anda dapat memanggil Array.prototype
metode pada objek asli-JS yang tidak Array
. Ini dan hal-hal penting lainnya yang memeriksa argumen adalah untuk menjamin kepatuhan spesifikasi mutlak.
Jika indeks tidak berurutan, atau jika indeks tidak berurutan, kode dalam solusi lain yang tercantum di sini akan rusak. Solusi yang akan bekerja lebih baik mungkin:
function in_array(needle, haystack) {
for(var i in haystack) {
if(haystack[i] == needle) return true;
}
return false;
}
Dan, sebagai bonus, inilah yang setara dengan array_search PHP (untuk menemukan kunci elemen dalam array:
function array_search(needle, haystack) {
for(var i in haystack) {
if(haystack[i] == needle) return i;
}
return false;
}
Ada proyek yang disebut Locutus , ini mengimplementasikan fungsi-fungsi PHP dalam Javascript dan in_array () disertakan, Anda dapat menggunakannya persis seperti yang Anda gunakan dalam PHP.
Contoh penggunaan:
in_array('van', myArray);
in_array(1, otherArray, true); // Forcing strict type
Anda cukup menggunakan fungsi "include" seperti yang dijelaskan dalam pelajaran ini di w3schools
sepertinya
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;
Solusi jQuery tersedia, periksa ducumentation di sini: http://api.jquery.com/jquery.inarray/
$.inArray( 10, [ 8, 9, 10, 11 ] );
Ada fungsi yang setara:
includes()
Lihat di sini: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
Jika Anda hanya ingin memeriksa apakah nilai tunggal dalam array, maka kode Paolo akan melakukan pekerjaan itu. Jika Anda ingin memeriksa nilai mana yang umum untuk kedua array, maka Anda akan menginginkan sesuatu seperti ini (menggunakan fungsi inArray 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;
}
Ini akan mengembalikan array nilai yang ada di keduanya a
dan b
. (Secara matematis, ini adalah persimpangan dari dua array.)
EDIT: Lihat Kode Editan Paolo untuk solusi untuk masalah Anda. :)
Jika Anda membutuhkan semua parameter PHP yang tersedia, gunakan ini:
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;
}
Tambahkan kode ini untuk Anda proyeksikan dan gunakan metode inArray objek-style
if (!Array.prototype.inArray) {
Array.prototype.inArray = function(element) {
return this.indexOf(element) > -1;
};
}
//How it work
var array = ["one", "two", "three"];
//Return true
array.inArray("one");
Dengan Dojo Toolkit , Anda akan menggunakannya dojo.indexOf()
. Lihat dojo.indexOf untuk dokumentasi, dan Array Made Easy oleh Bryan Forbes untuk beberapa contoh.
haystack.find(value => value == needle)
di mana tumpukan jerami adalah array dan jarum adalah elemen dalam array. Jika elemen tidak ditemukan akan dikembalikan tanpa ditentukan elemen lain yang sama.
Jika Anda akan menggunakannya di kelas, dan jika Anda lebih suka itu berfungsi (dan bekerja di semua browser):
inArray: function(needle, haystack)
{
var result = false;
for (var i in haystack) {
if (haystack[i] === needle) {
result = true;
break;
}
}
return result;
}
Semoga ini bisa membantu seseorang :-)
jQuery.inArray()
tidak tidak kembali boolean. Ini mengembalikan indeks elemen yang ditemukan atau -1 jika tidak ditemukan