Jika Anda tidak perlu mengetikkan paksaan (karena penggunaan indexOf
), Anda dapat mencoba sesuatu seperti berikut:
var arr = [1, 2, 3];
var check = [3, 4];
var found = false;
for (var i = 0; i < check.length; i++) {
if (arr.indexOf(check[i]) > -1) {
found = true;
break;
}
}
console.log(found);
Di mana arr
berisi item target. Pada akhirnya, found
akan muncul apakah array kedua memiliki paling tidak satu pertandingan melawan target.
Tentu saja, Anda dapat menukar nomor dengan apa pun yang ingin Anda gunakan - string baik-baik saja, seperti contoh Anda.
Dan dalam contoh spesifik saya, hasilnya seharusnya true
karena array kedua 3
ada di target.
MEMPERBARUI:
Inilah cara saya mengaturnya menjadi suatu fungsi (dengan beberapa perubahan kecil dari sebelumnya):
var anyMatchInArray = (function () {
"use strict";
var targetArray, func;
targetArray = ["apple", "banana", "orange"];
func = function (checkerArray) {
var found = false;
for (var i = 0, j = checkerArray.length; !found && i < j; i++) {
if (targetArray.indexOf(checkerArray[i]) > -1) {
found = true;
}
}
return found;
};
return func;
}());
DEMO: http://jsfiddle.net/u8Bzt/
Dalam hal ini, fungsi tersebut dapat dimodifikasi untuk targetArray
diteruskan sebagai argumen alih-alih hardcoded dalam penutupan.
UPDATE2:
Sementara solusi saya di atas mungkin berhasil dan (mudah-mudahan lebih) dapat dibaca, saya percaya cara "lebih baik" untuk menangani konsep yang saya jelaskan adalah melakukan sesuatu yang sedikit berbeda. "Masalah" dengan solusi di atas adalah bahwa di indexOf
dalam loop menyebabkan array target di-loop sepenuhnya untuk setiap item dalam array lain. Ini dapat dengan mudah "diperbaiki" dengan menggunakan "pencarian" (peta ... objek JavaScript literal). Ini memungkinkan dua loop sederhana, di atas setiap array. Ini sebuah contoh:
var anyMatchInArray = function (target, toMatch) {
"use strict";
var found, targetMap, i, j, cur;
found = false;
targetMap = {};
// Put all values in the `target` array into a map, where
// the keys are the values from the array
for (i = 0, j = target.length; i < j; i++) {
cur = target[i];
targetMap[cur] = true;
}
// Loop over all items in the `toMatch` array and see if any of
// their values are in the map from before
for (i = 0, j = toMatch.length; !found && (i < j); i++) {
cur = toMatch[i];
found = !!targetMap[cur];
// If found, `targetMap[cur]` will return true, otherwise it
// will return `undefined`...that's what the `!!` is for
}
return found;
};
DEMO: http://jsfiddle.net/5Lv9v/
Kelemahan dari solusi ini adalah hanya angka dan string (dan boolean) yang dapat digunakan (dengan benar), karena nilainya (secara implisit) dikonversi menjadi string dan ditetapkan sebagai kunci untuk peta pencarian. Ini tidak sepenuhnya baik / mungkin / mudah dilakukan untuk nilai-nilai non-literal.
for
loop dan beralih di atas array target. Jika setiap elemen terkandung dalam array saat ini (gunakancurrent.indexOf(elem) !== -1)
, maka semuanya ada di sana.