Nếu bạn không cần ép buộc kiểu (vì sử dụng indexOf
), bạn có thể thử một cái gì đó như sau:
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);
Nơi arr
chứa các mục tiêu. Cuối cùng, found
sẽ hiển thị nếu mảng thứ hai có ít nhất một trận đấu với mục tiêu.
Tất nhiên, bạn có thể trao đổi số cho bất cứ thứ gì bạn muốn sử dụng - chuỗi đều ổn, như ví dụ của bạn.
Và trong ví dụ cụ thể của tôi, kết quả sẽ là true
do mảng thứ hai 3
tồn tại trong mục tiêu.
CẬP NHẬT:
Đây là cách tôi sắp xếp nó thành một chức năng (với một số thay đổi nhỏ so với trước):
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/
Trong trường hợp này, hàm có thể được sửa đổi để targetArray
được truyền vào dưới dạng đối số thay vì mã hóa cứng trong bao đóng.
CẬP NHẬT2:
Mặc dù giải pháp của tôi ở trên có thể hoạt động và (hy vọng nhiều hơn) có thể đọc được, tôi tin rằng cách "tốt hơn" để xử lý khái niệm tôi mô tả là làm một cái gì đó hơi khác một chút. "Vấn đề" với giải pháp trên là indexOf
bên trong vòng lặp làm cho mảng đích bị lặp hoàn toàn cho mọi mục trong mảng khác. Điều này có thể dễ dàng được "sửa" bằng cách sử dụng "tra cứu" (bản đồ ... một đối tượng JavaScript theo nghĩa đen). Điều này cho phép hai vòng đơn giản, trên mỗi mảng. Đây là một ví dụ:
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/
Nhược điểm của giải pháp này là chỉ có thể sử dụng số và chuỗi (và booleans), bởi vì các giá trị được (ngầm) chuyển đổi thành chuỗi và được đặt làm khóa cho bản đồ tra cứu. Điều này không chính xác tốt / có thể / dễ dàng thực hiện cho các giá trị phi chữ.
for
vòng lặp và lặp qua mảng mục tiêu. Nếu mọi phần tử được chứa trong mảng hiện tại (sử dụngcurrent.indexOf(elem) !== -1)
, thì tất cả chúng đều nằm trong đó.