匹配2d或1d数组中的数组

时间:2013-07-17 15:49:52

标签: javascript

我很难搞清楚这一个。我有一个名为answerArray的数组,我需要看看它是否与其他4个数组中的一个匹配(其中一些是2d)ex:

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中找到匹配”

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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;
            }
        }
    }
}

答案 2 :(得分:-1)

NOOOO! EVAL()!我的名人!

基本上,问题是case4是undefined。你的for循环使用<=所以迭代器将会包括4.当你输入数组比较函数时,它不会进入类型检查块,因为这显然不是Array的实例。但是,没有什么能使它返回虚假。

只需将类型检查与arraysEqual中的长度比较一起移动,然后返回false。哦,并且......很多时候你会被要求不要在你的代码中使用eval。不过,我会假设它只是一种编写测试的快捷方式。