【问题标题】:jQuery DisjointjQuery 不相交
【发布时间】:2010-11-02 02:13:04
【问题描述】:

我有两个数组:

var a = new Array(1,2,3,4);
var b = new Array(5,3,2,6);

我想找出哪些元素在数组a 中但不在数组b 中,哪些元素在b 中但不在a 中?

我知道一种方法是遍历它们,但是有没有更有效的方法?

感谢您的宝贵时间。

【问题讨论】:

    标签: javascript jquery arrays


    【解决方案1】:

    您可以尝试以下方法:

    var aNotInB = $.grep(a, function($e) { return $.inArray($e, b) == -1; });
    var bNotInA = $.grep(b, function($e) { return $.inArray($e, a) == -1; });
    

    您可以将其定义为 jquery 函数:

    $.disjoin = function(a, b) {
        return $.grep(a, function($e) { return $.inArray($e, b) == -1; });
    };
    
    var aNotInB = $.disjoin(a,b);
    var bNotInA = $.disjoin(b,a);
    

    【讨论】:

    • 干得好 samjudson。问题的真正好和非常短的解决方案。
    • 不适用于这种情况 var a = new Array(1,2); var b = new Array(2);
    • 这样做的原因是创建了两个数组,a包含1和2,但是b是一个大小为2的空数组。
    【解决方案2】:

    PHP 的 in_array() 函数是 ported to Javascript 前一段时间。我不时使用它。此外,array_diff() 函数也是ported over

    function in_array(needle, haystack, argStrict) {
        // http://kevin.vanzonneveld.net 
        var key = '', strict = !!argStrict;
    
        if (strict) {
            for (key in haystack) {
                if (haystack[key] === needle) {
                    return true;
                }
            }
        } else {
            for (key in haystack) {
                if (haystack[key] == needle) {
                    return true;
                }
            }
        }
    
        return false;
    }
    
    function array_diff() {
        // *     example 1: array_diff(['Kevin', 'van', 'Zonneveld'], ['van', 'Zonneveld']);
        // *     returns 1: ['Kevin']
        var arr1 = arguments[0], retArr = {};
        var k1 = '', i = 1, k = '', arr = {};
    
        arr1keys:
        for (k1 in arr1) {
            for (i = 1; i < arguments.length; i++) {
                arr = arguments[i];
                for (k in arr) {
                    if (arr[k] === arr1[k1]) {
                        // If it reaches here, it was found in at least one array, so try next value
                        continue arr1keys; 
                    }
                }
                retArr[k1] = arr1[k1];
            }
        }
    
        return retArr;
    }
    

    【讨论】:

      【解决方案3】:

      您必须查看两个数组的每个元素以了解它们的区别。所以除了迭代两个数组别无他法:

      Array.prototype.diff = function(otherArray) {
          var diff = [], found;
          for (var i=0; i<this.length; i++) {
              found = false;
              for (var j=0; j<otherArray.length; j++) {
                  if (this[i] == otherArray[j]) {
                      found = true;
                      break;
                  }
              }
              if (!found) {
                  diff.push(this[i]);
              }
          }
          return diff;
      };
      
      var a = [1,2,3,4],
          b = [5,3,2,6];
      var aDiffB = a.diff(b),
          bDiffA = b.diff(a);
      

      您可以在数组排序时跳过一些比较,并从最后一次匹配后的元素的内部循环开始,如果值较大则将其中断:

      Array.prototype.diff = function(otherArray) {
          var diff = [], found, startAt = 0,
              a = this.sort(),
              b = otherArray.sort();
          for (var i=0; i<a.length; i++) {
              found = false;
              for (var j=startAt; j<b.length; j++) {
                  if (a[i] > b[j]) {
                      break;
                  }
                  if (a[i] == b[j]) {
                      found = true;
                      startAt = j + 1;
                      break;
                  }
              }
              if (!found) {
                  diff.push(a[i]);
              }
          }
          return diff;
      };
      

      但是对两个数组进行排序也需要花费。

      【讨论】:

        【解决方案4】:

        您可以先对它们进行排序 (a.sort()),然后进行简单的迭代。

        【讨论】:

          猜你喜欢
          • 2011-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多