(Kullanımı nedeniyle) tür zorlamasına ihtiyacınız yoksa indexOf
, aşağıdakine benzer bir şey deneyebilirsiniz:
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
Hedef öğeleri nerede içerir. Sonunda, found
ikinci dizinin hedefe karşı en az bir eşleşmesi olup olmadığını gösterecektir .
Tabii ki, kullanmak istediğiniz herhangi bir şey için sayıları değiştirebilirsiniz - dizeler örneğiniz gibi iyidir.
Ve benim özel örneğimde, sonuç true
ikinci dizinin 3
hedefte bulunması nedeniyle olmalıdır .
GÜNCELLEME:
Ben nasıl bir fonksiyon (daha önce bazı küçük değişiklikler ile) içine düzenlemek istiyorum:
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/
Bu durumda, işlev targetArray
, kapanıştaki sabit kodlanmış yerine bir bağımsız değişken olarak geçirilecek şekilde değiştirilebilir .
Update2:
Yukarıdaki çözümüm işe yarayabilir ve (umarım daha fazla) okunabilir olsa da, tarif ettiğim konsepti ele almanın "daha iyi" yolunun biraz farklı bir şey yapmak olduğuna inanıyorum. Yukarıdaki çözüm ile "sorun" indexOf
döngü içinde hedef dizisi diğer dizideki her öğe için tamamen döngü neden olmasıdır. Bu, bir "arama" (bir harita ... bir JavaScript nesnesi değişmezi) kullanılarak kolayca "düzeltilebilir". Bu, her dizi üzerinde iki basit döngüye izin verir. İşte bir örnek:
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/
Bu çözümün dezavantajı, değerler (dolaylı olarak) dizelere dönüştürüldüğünden ve arama haritasının anahtarları olarak ayarlandığından yalnızca sayıların ve dizelerin (ve booleans) kullanılabilmesidir (doğru). Bu, gerçek olmayan değerler için tam olarak iyi / mümkün / kolay yapılmaz.
for
döngü kullanın ve hedef dizi üzerinden yineleyin. Her öğe geçerli dizi içinde bulunuyorsa (kullanıncurrent.indexOf(elem) !== -1)
, o zaman hepsi oradalar.