2014-10-23 1 views
1

У меня есть два массива;Проверьте, содержит ли переменная какое-либо значение массива

arr1 = ["foo.com", "bar.com"], 
arr2 = ["//test.net/index.html", "http://www.bar.com", "https://foo.com/example.js"] 

Я перебор arr2, и я хочу, чтобы пропустить те, которые содержат любое значение arr1.

В настоящее время я использую indexOf, но это не работает, если значения не совпадают точно.

$.each(arr2, function(k,v){ 
    if(arr1.indexOf(v) == -1) 
    console.log(v); 
}); 

Я надеюсь, что для приведенного выше кода для вывода

//test.net/index.html 

, так как это единственное значение arr2 что не содержат любое значение arr1. Что я делаю не так?

+0

тест назад, все 'arr1' строк короче' arr2' строк, чтобы они никогда не будут содержать их – charlietfl

ответ

3

Я бы написал две каждую петлю для этого:

arr1 = ["foo.com", "bar.com"], 
 
arr2 = ["//test.net/index.html", "http://www.bar.com", "https://foo.com/example.js"] 
 

 
$.each(arr2, function(x,y){ 
 
    var found = false; 
 
    $.each(arr1, function(k,v){ 
 
     if(!(y.indexOf(v) == -1)){ 
 
     found = true; 
 
     return false; 
 
     } 
 
    }); 
 
    
 
    if(!found){ 
 
     console.log(y); 
 
    } 
 
    
 
    found= false; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>

+0

Да, вы можете это сделать. Однако было бы более оптимальным использовать цикл 'for' и' break', чтобы остановить поиск после того, как оно найдено. Или вернуть 'false' из' $ .each', чтобы разбить цикл. – dfsq

+0

Да, это правда, я изменил код, чтобы вернуть false после основания. –

3

Вы можете использовать filter + some ES5 методы массива:

var arr1 = ["foo.com", "bar.com"], 
 
    arr2 = ["//test.net/index.html", "http://www.bar.com", "https://foo.com/example.js"]; 
 

 
var result = arr2.filter(function(val) { 
 
    return !arr1.some(function(el) { 
 
     return val.indexOf(el) !== -1; 
 
    }); 
 
}); 
 

 
alert(result);

Поддержка ES5 начинается с IE9 +, но если вам это нужно, чтобы работать в старых IE, вы можете использовать polyfills (см. ссылки, которые я предоставил), или это довольно тривиально переписать some часть с простой петлей for и использовать $.grep вместо Array.prototyp.filter.

+0

* фильтр * также метод ES5. ;-) – RobG

+0

@RobG Да, точно так же, как я сказал 'filter' и' some' methods :) – dfsq

0

Это кажется Что вы используете Array версию indexOf, которая не работает id, совпадение не является exac т. С немного больше настройки, вы можете использовать строковую версию IndexOf

function compareValues (arr1, arr2){ 

var res = false; 
$.each(arr2, function(k,v) { 
    checkAgainstArray(arr1, v); 
}); 

function checkAgainstArray(arr1, value) { 
    $.each(arr1, function(k, v) { 
     if(value.indexOf(v) !== -1){ 
     res = true; 
     } 
    }); 
} 
    return res; 
} 

// позже

вар isValueInArray = compareValues ​​(arr1, arr2);

(код не проверял), но я надеюсь, что это помогает

Смежные вопросы