【问题标题】:How can I check if all variables are different?如何检查所有变量是否不同?
【发布时间】:2015-08-10 17:15:49
【问题描述】:

是否可以通过其他方式检查所有变量是否彼此不同?

var a = 1, b = 2, c = 3, d = 4;

if(a != b && a != c && a != d && b != a && b != c && b != d && c != a && c != b && c != d && d != a && d != b && d != c){
  //All numbers are different
}

例如

if(a != b != c != d){

}

【问题讨论】:

  • 通常,当您的数据是结构化的(数组、对象等)时会出现这个问题。这里的第一步可能是为您的数据进行适当的设计。
  • 我建议你创建一个变量数组并循环遍历它们!如果你真的想留在major if case,你可以去一些if else if建设。

标签: javascript variables math logic


【解决方案1】:

您可以将它们全部存储在一个对象中并检查键的数量是否等于使用的变量的数量,就像这样

var dummy = {};
dummy[a] = true;
dummy[b] = true;
dummy[c] = true;
dummy[d] = true;
console.log(Object.keys(dummy).length === 4);

如果值不同,则每次都会创建一个新的键,键的数量将等于使用的变量数。

【讨论】:

  • 这很有创意,影响很小。
【解决方案2】:

正如 Denys Séguret 评论的那样,如果您的数据有适当的结构,那么就有可能以更优雅的方式进行。

但是,您仍然可以简化,因为您可以删除重复检查。

例如,您检查 a != b,然后检查 b != a。这两个检查实际上是相同的,只是顺序不同。

删除所有重复项会给您...

if(a != b && a != c && a != d && b != c && b != d && c != d)

这有点简单,尽管你最好还是结构化你的数据。

【讨论】:

    【解决方案3】:

    使用数组的另一种方式

    var a =10, b = 20, c=30, d =40, e =50;
    alert(isVariablesDifferent(a,b,c,d,e));
    
    function isVariablesDifferent(){
        var params = Array.prototype.slice.call(arguments);
        for(var i = 0; i < params.length; i++){
            if(params.lastIndexOf(params[i]) !== i){
                return false;
            }
        }
        return true;
    }
    

    【讨论】:

      【解决方案4】:

      另一种解决方案是push数组中的变量:

      var a = 1,
        b = 2,
        c = 3,
        d = 4;
      
      var arr = [];
      arr.push(a);
      arr.push(b);
      arr.push(c);
      arr.push(d);
      var sorted_arr = arr.sort(); // You can define the comparing function here. 
      // JS by default uses a crappy string compare.
      var results = [];
      for (var i = 0; i < arr.length - 1; i++) {
        if (sorted_arr[i + 1] == sorted_arr[i]) {
          results.push(sorted_arr[i]);
        }
      }
      
      alert(results);

      【讨论】:

        【解决方案5】:

        我为你做了一个测试这个功能。但是,对于大型数据集,这可能代价高昂。

        这里是小提琴:https://jsfiddle.net/Luqm8z7b/

        function uniqueTest(ary){
         for(var i=ary.pop(); ary.length > 0;i=ary.pop()){
          for(var j = 0; j < ary.length; j++){
           if(i === j) return false;
          }
         }
         return true;
        }
        
        var a = 1, b = 2, c = 3, d = 4;
        var list = [];
        list.push(a, b, c, d);
        console.log(uniqueTest(list));
        

        【讨论】:

          【解决方案6】:

          创建一个变量数组。迭代整个从第一个到最后一个元素并进行比较或以其他方式进行硬编码,如下所示。

          var a = 1, b = 2, c = 3, d = 4; 
          
          if(a != b && a != c && a != d && b != c && b != d && c != d)
          alert('all the variables are unique');
          

          请参考我在 jsfiddle 中的示例代码

          http://jsfiddle.net/parthipans/fNPvf/15217/

          【讨论】:

          • 除了使用对称性来跳过 OP 的一半比较之外,这真的有什么作用吗?为什么不向我们展示第一个建议的代码?
          【解决方案7】:

          我相信,如果没有上下文,应该很难提供高质量的答案,但由于 ECMA-Script 5 有一个 Array.prototype.every 函数来检查所有数组项是否符合布尔表达式。也就是说,你可以这样表达同样的问题:

          var a = 1, b = 2, c = 3, d = 4; 
          
          if(
            [b, c, d].every(function(someVar) { return someVar != a; })
            && [a, c, d].every(function(someVar) { return someVar != b })
            && [a, b, d].every(function(someVar) { return someVar != c })
            && [a, b, c].every(function(someVar) { return someVar != d })
          ) {
            alert("all different!");
          }

          或者查看如何将different(...) 函数的实现简化为Array.prototype(或者您可以将其实现为某个自定义对象的属性或仅作为常规程序函数...)。

          Array.prototype.different = function() {
            var results = [];
            
            for(var i = 0; i < this.length; i++) {
               // This is to clone the array so we don't modify the source one
               var arrayCopy = [].concat(this);
              
               // This drops the variable value to check and returns it
               var varValueToCheck = arrayCopy.splice(i, 1);
              
               // Then we use every to check that every variable value doesn't
               // equal current variable value to compare
               results.push(arrayCopy.every(
                 function(varValue) {
                   return varValue != varValueToCheck;
                 })
               );
            }
            
            // Once we've got all boolean results, we call every() on
            // boolean results array to check that all items are TRUE
            // (i.e. no variable equals to other ones!)
            return results.every(function(result) { return result; });
          };
          
          // This should avoid that other libs could re-define "different"
          // function, and also it should avoid for..in or forEach issues
          // finding unexpected functions, as this function will be hidden 
          // when iterating Array.prototype
          Object.defineProperty(Array.prototype, "different", {
            enumerable: false,
            configurable: false,
            writable: false
          });
          
          var a = 1, b = 2, c = 3, d = 4; 
          
          // Simplified check! 
          if([a, b, c, d].different()) {
             alert("also all different!!!");  
          }

          现在的问题可能是,如果用我的提议来简化像你这样的 if 语句是否有点矫枉过正,但这取决于你的实际用例。

          【讨论】:

            猜你喜欢
            • 2014-09-01
            • 2013-03-28
            • 2021-08-18
            • 1970-01-01
            • 2014-03-05
            • 1970-01-01
            • 1970-01-01
            • 2011-05-20
            • 1970-01-01
            相关资源
            最近更新 更多