2013-07-18 46 views
3

我很难为此提供解决方案。检查数组中的每个元素是否在多个数组中

比方说有与在每个颜色1-3颜色6个数组,并且颜色可以重复:

['white', 'blue'] 
['green', 'yellow'] 
['black'] 
['yellow', 'blue', 'pink'] 
['orange', 'red'] 
['brown', 'white'] 

和用户输入6点的颜色,例如:白色,蓝色,粉红色,黑色,橙色,黄色。如何检查所有这些颜色是否都是数组的一部分,并且可以选择所有这些颜色,假定每个数组中只能选择一个。

我希望我的问题是可以理解的。

编辑:改写的问题

有6个阵列的颜色,如上述可见,并且用户不得不从每个阵列中选择1。我如何检查用户的输入是否正确,假定他提交的顺序不是数组的顺序。

+0

有什么想法?只有2个嵌套循环与'if'? – zerkms

+2

这是一个家庭作业吗?听起来像是一项家庭作业。 – Posthuma

+0

问题是颜色重复,只能从每个数组中选择一个。不,不是家庭作业。这是一个在线游戏,我只是用颜色来使问题更容易。 –

回答

2

这看起来像一个递归工作(可能不是最有效的,但肯定是最简单的解决方案,如果你的数据是这个小它不应该的问题):

var check = function(input, colors) { 
    if (!input.length) { 
     return true; 
    } 
    var input_color = input.pop(); 
    var ok = false; 
    for (var i = 0; i < colors.length; i++) { 
     var color = colors[i]; 
     if (!color) { 
      break; 
     } 
     if (color.indexOf(input_color) !== -1) { 
      colors.splice(i, 1); 
      ok = check(input, colors); 
      if (!ok) { 
       colors.splice(i, 0, color); 
      } else { 
       break; 
      } 
     } 
    } 
    if (!ok) { 
     input.push(input_color); 
    } 
    return ok; 
}; 

与用法:

var colors = [ 
    ['white', 'blue'], 
    ['green', 'yellow'], 
    ['black'], 
    ['yellow', 'blue', 'pink'], 
    ['orange', 'red'], 
    ['brown', 'white'] 
]; 
check(['white', 'blue', 'pink', 'black', 'orange', 'yellow'], colors); 

注意,它会同时改变colorsinputs阵列(你每次调用check时间,使它们的副本)。

其实这个问题跟路径发现问题很相似。这是一个强力解决方案。

+0

优秀,那正是我想要的。谢谢! –

相关问题