允许从可用值中仅选择预先假定的组合

时间:2014-10-17 05:39:22

标签: javascript angularjs

让我们说我们有A,B,C和D值的参数。现在我们要强制用户只选择A,B,C或A,C,D或A或B或C.

我们希望仅允许5种预定义组合,而不是允许所有可能的16种组合。我尝试了但是为此我必须为每一个选择设置条件。

如果我们假设这个值与复选框绑定,我们需要检查所选值是否与我们的预定义组合一致。

我需要在javascript或angular.js中实现这一点。请帮助我使用适当的算法进行此类操作。

我尝试使用以下逻辑来实现此目的,但这不会立即提示用户,仅在最终提交后发出提醒

// multi-dimentional array of defined combinations
var preDefinedCombinations = [['a','b','c'], ['a','c','d'], ['a'], ['b'], ['c']];

// Combination user select
var selectedvalues = [];

// Function called on selection or removing value (i.e a,b,c,d)
function selectOption(value){
    var checkIndex = selectedvalues.indexof(value);
    if(checkIndex == -1){
        selectedvalues.push(value);
    }else{
        selectedvalues.splice(checkIndex, 1);
    }

}
// function called on submition of combination
function checkVaildCombination(){
    if(preDefinedCombinations.indexOf(selectedvalues) == -1){
        alert('Invalid Combination');
    }else{
        alert('Valid Combination');
    }
}

此代码仅提供有关组合是否有效的信息,而不是根据选择可能的组合。

2 个答案:

答案 0 :(得分:1)

可能是以下代码可以帮助您解决问题

<script>
function validateForm(){
  var checkBoxValues = this.a.checked.toString() + this.b.checked.toString() + this.c.checked.toString() + this.d.checked.toString();
  if( checkBoxValues == 'truetruetruefalse'   || // abc
      checkBoxValues == 'truefalsetruetrue'   || // acd
      checkBoxValues == 'truefalsefalsefalse' || // a
      checkBoxValues == 'falsetruefalsefalse' || // b
      checkBoxValues == 'falsefalsetruefalse' ){ // c
    return true;
  }
  return false;
}
</script>
  <form onsubmit="return validateForm()" action="javascript:alert('valid')">
    <input type="checkbox" name="mygroup" id="a">
    <input type="checkbox" name="mygroup" id="b">
    <input type="checkbox" name="mygroup" id="c">
    <input type="checkbox" name="mygroup" id="d">
    <input type="submit">
  </form>

答案 1 :(得分:1)

https://stackoverflow.com/a/1885660/1029988被盗:

function intersect_safe(a, b)
{
  var ai=0, bi=0;
  var result = new Array();

  while( ai < a.length && bi < b.length )
  {
     if      (a[ai] < b[bi] ){ ai++; }
     else if (a[ai] > b[bi] ){ bi++; }
     else /* they're equal */
     {
       result.push(a[ai]);
       ai++;
       bi++;
     }
  }

  return result;
}

然后在你的代码中:

function checkVaildCombination(){
    function get_diff(superset, subset) {
        var diff = [];
        for (var j = 0; j < superset.length; j++) {
            if (subset.indexOf(superset[j]) == -1) { // actual missing bit
                diff.push(superset[j]);
            }
        }
        return diff;
    }

    if(preDefinedCombinations.indexOf(selectedvalues) == -1){
        missing_bits = [];
        diffed_bits = [];
        for (var i = 0; i < preDefinedCombinations.length; i++) {
            var intersection = intersect_safe(preDefinedCombinations[i], selectedvalues);
            if (intersection.length == selectedvalues.length) { // candidate for valid answer
                missing_bits.push(get_diff(preDefinedCombinations[i], intersection));
            } else {
                var excess_bits = get_diff(selectedvalues, intersection),
                    missing_bit = get_diff(preDefinedCombinations[i], intersection);

                diffed_bits.push({
                    excess: excess_bits,
                    missing: missing_bit
                });
            }
        }

        var message = 'Invalid Combination, if you select any of these you`ll get a valid combination:\n\n' + missing_bits.toString();
        message += '\n\n Alternatively, you can reach a valid combination by deselected some bits and select others:\n';

        for (var j = 0; j < diffed_bits.length; j++) {
            message += '\ndeselect: ' + diffed_bits[j].excess.toString() + ', select: ' + diffed_bits[j].missing.toString();
        }
        alert(message);
    } else {
        alert('Valid Combination');
    }
}

你当然希望格式化输出字符串,但是那个代码(希望它毕竟是餐巾代码)给你缺少的位来与你已经选择的内容进行有效的组合