หากคุณไม่ต้องการการบีบบังคับประเภท (เนื่องจากการใช้งานindexOf
) คุณสามารถลองสิ่งต่อไปนี้:
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);
arr
มีรายการเป้าหมายอยู่ที่ไหน ในตอนท้ายfound
จะแสดงว่าอาร์เรย์ที่สองมีการแข่งขันอย่างน้อยหนึ่งครั้งกับเป้าหมายหรือไม่
แน่นอนคุณสามารถสลับตัวเลขสำหรับสิ่งที่คุณต้องการใช้ - สตริงนั้นดีเช่นตัวอย่างของคุณ
และในตัวอย่างเฉพาะของฉันผลลัพธ์ควรเป็นtrue
เพราะอาร์เรย์ที่สอง3
มีอยู่ในเป้าหมาย
UPDATE:
นี่คือวิธีที่ฉันจะจัดระเบียบเป็นฟังก์ชั่น (มีการเปลี่ยนแปลงเล็กน้อยจากก่อน):
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/
ในกรณีนี้ฟังก์ชั่นสามารถปรับเปลี่ยนให้targetArray
ส่งผ่านเป็นอาร์กิวเมนต์แทนฮาร์ดโค้ดในการปิด
UPDATE2:
ในขณะที่วิธีการแก้ปัญหาข้างต้นของฉันอาจทำงานได้และเป็น (หวังมากกว่า) อ่านได้ฉันเชื่อว่าวิธีที่ "ดีกว่า" ในการจัดการกับแนวคิดที่ฉันอธิบายคือการทำสิ่งที่แตกต่างกันเล็กน้อย "ปัญหา" ด้วยการแก้ปัญหาข้างต้นคือการindexOf
ที่วงในทำให้อาร์เรย์เป้าหมายที่จะวนรอบอย่างสมบูรณ์สำหรับทุกรายการในอาร์เรย์อื่น สิ่งนี้สามารถ "แก้ไข" ได้อย่างง่ายดายโดยใช้ "การค้นหา" (แผนที่ ... ตัวอักษรของวัตถุ JavaScript) สิ่งนี้อนุญาตให้วนซ้ำสองลูปง่ายกว่าแต่ละอาร์เรย์ นี่คือตัวอย่าง:
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/
ข้อเสียของโซลูชันนี้คือสามารถใช้ตัวเลขและสตริง (และบูลีน) ได้อย่างถูกต้องเท่านั้น (เพราะถูกแปลงเป็นค่า (โดยปริยาย) เป็นสตริงและตั้งค่าเป็นคีย์ของแผนผังการค้นหา สิ่งนี้ไม่ดี / เป็นไปได้ / ทำได้อย่างง่ายดายสำหรับค่าที่ไม่ใช่ตัวอักษร
for
วนซ้ำแล้ววนซ้ำไปยังอาร์เรย์เป้าหมาย หากทุกองค์ประกอบมีอยู่ภายในอาร์เรย์ปัจจุบัน (ใช้current.indexOf(elem) !== -1)
แล้วก็จะอยู่ในนั้นทั้งหมด