Setara dengan JavaScript pada in_array PHP ()

223

Apakah ada cara dalam JavaScript untuk membandingkan nilai dari satu array dan melihat apakah ada di array lain?

Mirip dengan in_arrayfungsi PHP ?

roflwaffle
sumber

Jawaban:

258

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.

Paolo Bergantino
sumber
1
jQuery.inArray()tidak tidak kembali boolean. Ini mengembalikan indeks elemen yang ditemukan atau -1 jika tidak ditemukan
Brad Kent
Karena peringkat tinggi - Anda harus menandai jawaban Anda sebagai kedaluwarsa
Gerfried
1
ini dokumentasi indexOf w3schools.com/jsref/jsref_indexof_array.asp
yussan
74

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)
alemjerus
sumber
66

Array.indexOfdiperkenalkan 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.

Alex Barrett
sumber
Ini adalah implementasi yang lebih baik / lebih aman / lebih baik dari tautan / kode yang sudah diposting di sini; spesifikasi tidak memerlukan pemeriksaan array di dalam tumpukan jerami, dan itulah yang diinginkan OP.
Paolo Bergantino
3
Kebetulan, apa tujuannya this.length >>> 0? Apakah itu konversi ke jenis Angka?
harto
3
Array.indexOfsekarang 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.lengthke Nomor yang dapat direpresentasikan sebagai integer 32-bit yang tidak ditandatangani. Asli Arrayhanya dapat memiliki panjang yang sudah sesuai dengan ini, tetapi spesifikasi menyatakan bahwa Anda dapat memanggil Array.prototypemetode pada objek asli-JS yang tidak Array. Ini dan hal-hal penting lainnya yang memeriksa argumen adalah untuk menjamin kepatuhan spesifikasi mutlak.
bobince
3
Ada versi polyfill berbeda yang tersedia langsung dari Mozilla - developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Algy Taylor
@harto saya menjawab 8 tahun setelah komentar Anda, tetapi mungkin orang lain dapat memiliki pertanyaan yang sama => lihat stackoverflow.com/questions/1822350/…
Frosty Z
14

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;
}
random_user_name
sumber
Pengganti bagus. Benar-benar membuat porting dari php ke node mudah. terima kasih
Rahim Khoja
9

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
Marcio Mazzucato
sumber
4
Ada juga fungsi inArray di API JQuery. Periksa api.jquery.com/jQuery.inArray
ahPo
@ ahPo, Bagus! Tetapi implementasi Locutus memiliki keuntungan menjadi javascript murni tanpa dependensi. Jadi, pilih yang terbaik untuk kebutuhan Anda
Marcio Mazzucato
1
atau Anda bisa mengimpor fungsi yang diperlukan dari Locutus.
Niket Pathak
7

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');

AbdulRhman Khallil
sumber
5
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;
Rax Wunter
sumber
5

Solusi jQuery tersedia, periksa ducumentation di sini: http://api.jquery.com/jquery.inarray/

$.inArray( 10, [ 8, 9, 10, 11 ] );
Webar
sumber
3
jangan lupa untuk memeriksa seperti ini: if ($. inArray (10, [8, 9, 10, 11])> -1) karena saya memang suka ini: if ($. inArray (10, [8, 9, 10, 11])) dan selalu kembali benar
temirbek
PS: Ini tipe sensitif jadi jika memeriksa angka pastikan tipe data Anda cocok! yaitu: $ .inArray ('10', [8, 9, 10, 11]); akan kembali -1
Oliver M Grech
3

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 adan b. (Secara matematis, ini adalah persimpangan dari dua array.)

EDIT: Lihat Kode Editan Paolo untuk solusi untuk masalah Anda. :)

Chris Doble
sumber
Meskipun ini bagus, sebenarnya bukan yang diminta OP; itu tidak mereplikasi fungsi in_array PHP.
Paolo Bergantino
3

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;
}
Andres SK
sumber
3

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");
Никита Овчинников
sumber
2
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.

Emmanuel de Carvalho Garcia
sumber
1
function in_array(what, where) {
    var a=false;
    for (var i=0; i<where.length; i++) {
        if(what == where[i]) {
            a=true;
            break;
        }
    }
    return a;
}
Priya
sumber
1

Saya menemukan solusi jQuery besar di sini di SO.

var success = $.grep(array_a, function(v,i) {
    return $.inArray(v, array_b) !== -1;
}).length === array_a.length;

Saya berharap seseorang memposting contoh bagaimana melakukan ini dalam garis bawah.

pymarco
sumber
1
function in_array(needle, haystack){

    return haystack.indexOf(needle) !== -1;
}
crisswalt
sumber
Ini hanya mengembalikan apakah itu elemen pertama dalam array; jika indexOf(needle) > 0itu akan kembali salah
DiMono
0

Setara in_arraydengan underscoreadalah _.indexOf

Contoh:

_.indexOf([3, 5, 8], 8); // returns 2, the index of 8 _.indexOf([3, 5, 8], 10); // returns -1, not found

Bogdan D
sumber
0

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 :-)

MageParts
sumber