检查数组的每个元素是否在多个数组中

时间:2013-07-18 22:04:02

标签: javascript arrays

我很难为此找到解决方案。

假设有6种颜色阵列,每种颜色有1-3种颜色,颜色可以重复:

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

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

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

编辑:改述问题

有6种颜色数组,如上所示,用户必须从每个数组中选择1。我如何检查用户的输入是否正确,假设他提交的顺序不是数组的顺序。

1 个答案:

答案 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时都必须复制它们。)

实际上这个问题与寻路问题非常相似。这是一个强力解决方案。