2013-07-17 2 views
1

У меня возникли проблемы с этим. У меня есть массив с именем answerArray, и мне нужно, чтобы увидеть, если она соответствует одному из 4-х других массивов (некоторые из которых являются 2d) ех:Массив совпадений в массиве 2d или 1d

var answerArray = [1, 2, 2, 2, 1, 1]; 
var case1 = [ 
      [1, 2, 3, 1, 1, 1], 
      [1, 2, 2, 2, 1, 1], 
      [1, 2, 3, 2, 1, 1], 
      [1, 2, 2, 1, 1, 1] 
           ]; 
var case2 = [1, 2, 3, 1, 1, 2]; 
var case3 = [ 
      [1, 2, 3, 1, 2], 
      [1, 3, 2, 2, 2] 
          ]; 
var case4 = [1, 4]; 

В этом примере answerArray имеет матч с case1, потому что case1 содержит [1, 2, 2, 2, 1, 1]

Вот jsFiddle я, кажется, что им близко, но до сих пор не могу получить его: http://jsfiddle.net/dH2gx/1/

Если изменить answerArray к [1,4] вы увидите, что он говорит: «Найдено Совпадение по делу 4»

+1

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

+0

взгляните на этот ответ: http://stackoverflow.com/questions/7837456/comparing-two-arrays-in-javascript – intuitivepixel

+0

@intuitivepixel, который является точным способом, который я пытаюсь, не работает:/ – mario

ответ

0

Я понял это !! Для тех, кто в будущем пытается сделать то же самое.

Я сделал прототип массива «сравнить» посмотреть здесь (SO Answer)

for (var k = 1; k <= 4; k++) {//Loop number of cases 
    var caseArray = eval("case" + k);//To be able to loop through each case 
    for (var i = 0; i < caseArray.length; i++) { 
     if ($.isArray(caseArray[i])) { //Check if array[i] is another array (2d array) 
      if (caseArray[i].compare(answerArray)) { //Compare the nested array 
       console.log("MATCH " + k); 
       return k; 
      } 
     } else {//Not a 2d array 
      if (caseArray.compare(answerArray)) {//compare the array 
       console.log("MATCH " + k); 
       return k; 
      } 
     } 
    } 
} 
-1

NOOOO! EVAL()! МОЙ НЕМЕЗИС!

В принципе, проблема в том, что дело4 составляет undefined. В цикле for используется <=, поэтому итератор будет увеличивать и включать 4. Когда вы вводите функцию сравнения массива, он не вводит блок проверки типов, потому что это, очевидно, не экземпляр массива. Но тогда ничто не заставляет его возвращать false.

Просто переместите проверку типов вместе со сравнением длины в arraysEqual и верните false. О, и ... вас много раз попросят не использовать eval в вашем коде. Я предполагаю, что это был просто быстрый способ написать тест.

+0

Я начинаю i в 1, поэтому case4 оценивается. Кроме того, я знаю, что все говорят, что я не должен использовать eval. Он делает то, что мне нужно в этой ситуации, поэтому пока я буду использовать его :) – mario

+0

Хорошо, есть некоторые путаницы, потому что ваша скрипка отличается от вашего вопроса: в вашем вопросе нет случая4. – Katana314

+0

Да, извините. Исправлен вопрос. – mario

0

удивительно, что вы можете использовать RegExp на числах и массивов:

var answerArray = [1, 2, 2, 2, 1, 1]; 
var case1 = [ 
    [1, 2, 3, 1, 1, 1], 
    [1, 2, 2, 2, 1, 1], 
    [1, 2, 3, 2, 1, 1], 
    [1, 2, 2, 1, 1, 1] 
]; 
var case2 = [1, 2, 3, 1, 1, 2]; 
var case3 = [ 
    [1, 2, 3, 1, 2], 
    [1, 3, 2, 2, 2] 
]; 
var case4 = [1, 4]; 

var hit=new RegExp("^"+answerArray+"$", "m"); 
var names=['case1', 'case2', 'case3', 'case4']; 
var res=[case1, case2, case3, case4].map(function(a,b,c){ 

    return hit.test(a.join("\n")) && names[b]; 

}).filter(Boolean); 


alert(res) // shows: "case1" 
Смежные вопросы