2013-06-17 2 views
2

Используя следующую функцию, я ищу массив для существования значения;Сопоставьте любой элемент массива с другим массивом

var checkboxValues = ['large-car', 'small-car', 'automatic']; 
var carType = ["large-car"]; 

function searchArray(arguments) 
{ 
    var o = {}; 
    for(var i=0;i<arguments.length;i++) 
    { 
    o[arguments[i]]=null; 
    } 
    return o; 
} 

if (carType in searchArray(checkboxValues)) 
    //do something... 

Это условие хорошо работает, когда carType (который сам является массивом) содержит только одно значение, но когда carType содержит несколько значений, таких как,

var carType = ["large-car", "4WD"]; 

... то функция возвращает ложь.

Чтобы дать некоторый фон, что я пытаюсь сделать, это показать или скрыть карту маркеры (через Google Maps), основанные на определенных условиях,

  • Автоматическая
  • Руководство
  • Маленький автомобиль
  • Большой автомобиль
  • 4WD

Каждый из этих Валу ues представлен как флажок. Если выбраны «Автоматический» и «Малый автомобиль», отображаются только отображаемые маркеры карт, которые содержат оба эти значения.

Если выбраны «Автоматический», «Малый автомобиль» и «Большой автомобиль», то отображаются только те значения, которые соответствуют этим выборам.

Это работает, если массив carType содержит только одно значение, но как индивидуальное транспортное средство может иметь более одного типа, как показано выше, здесь функция не работает.

Каков наилучший способ записи функции, позволяющей сравнивать несколько значений в одном массиве с другим?

+0

'arguments' это специальное значение в функции, вы не должны использовать его в качестве имени переменной. –

+1

Ну, вам понадобятся две петли, вложенные друг в друга - одна, которая перебирает ваши предметы, и тот, который сравнивает текущий элемент со всеми значениями поиска. – CBroe

ответ

1

Snippet взятую из this answer.

function arrayUnique(array) { 
    var a = array.concat(); 
    for(var i=0; i<a.length; ++i) { 
     for(var j=i+1; j<a.length; ++j) { 
      if(a[i] === a[j]) 
       a.splice(j--, 1); 
     } 
    } 
    return a; 
}; 

И затем использовать его как это:

var checkboxValues = ['large-car', 'small-car', 'automatic'], 
    carType = ["large-car"], 
    merged = arrayUnique(checkboxValues.concat(carType)); 
if (merged.length === checkboxValues.length) {...} 

Если вам необходимо вернуть совпадающие элементы двух массивов вы можете сделать это:

function matchArrays(base, toSearch) { 
    var returnArray = []; 
    for (var i = 0; i < toSearch.length; i++) { 
     if (base.indexOf(toSearch[i]) !== -1) returnArray.push(toSearch[i]); 
    } 
    return returnArray; 
} 

Использование:

var match = matchArrays(checkboxValues, carType); // return "large-car" 
+0

Спасибо за ваш ответ. Если 'carType' содержит любое другое значение, не показанное в массиве' checkboxvalues', условие не выполняется. Массив может содержать, например, '[" большой автомобиль "," SUV "]', если одно из значений соответствует мне нужно вернуть найденное значение, другое несоответствующее значение может быть отброшено. – userabuser

+0

См. Редактирование, должно быть то, что вам нужно сейчас –

+0

Цените своего помощника по редактированию. Если я поставлю '[« большой автомобиль »,« маленький автомобиль »], то возвращается только первый результат, а второй - нет. Если я поставлю '[« большая головка »,« маленький автомобиль »], то возвращается« маленький автомобиль ». Условие должно возвращать каждое значение, если они совпадают. Поэтому он возвращает только первое правильное значение, которое он находит, а не после него. – userabuser

1

Посмотрите на array_intersect from PHPJS, воспроизведение функции PHP array_intersect в JavaScript.

+0

Забыл о PHPJS, закладок, но никогда не использовал его. 'array_intersect' был бы идеальным. – userabuser

0

Попробуйте это решение JQuery:

<script type="text/javascript"> 
    var checkboxValues = ['large-car', 'small-car', 'automatic']; 
    var carType = ["large-car"]; 
    if ($.inArray(carType[0].toString(), checkboxValues) == -1) { 
     return false;// if not exists 
    } 
</script> 
+0

Что такое '' '' ???? –

+0

извините, но решение jqeury –

1

Вы можете использовать функциональность js для matc h массива. Один из способов - использовать функцию indexOf(), которая возвращает индекс строки, если она найдена в массиве или -1, если не найдена.

var checkboxValues = ["large-car", "small-car", "automatic"]; 
var carType = ["large-car","automatic","some car"]; 

function searchMatch(carType) { 
    var result = new Array(); 
    for(var i=0;i < carType.length;i++) { 
     // If match found push the match to the result array. 
     if(checkboxValues.indexOf(carType[i]) != -1){ 
      result .push(carType[i]) 
     } 

    } 
return result ; 
} 

В результате вы получите [«большой автомобиль», «автоматический»];

+1

Это также сделало бы трюк .. спасибо. – userabuser

0

если вы используете underscoreJs может выглядеть следующим образом

var checkboxValues = ['large-car', 'small-car', 'automatic']; 
var carType = ['small-car','automatic']; 

var result=_.any(checkboxValues,function(checkbox){ 
    return _.any(carType,function(carT){ return carT==checkbox;}); 
}); 
Смежные вопросы