2009-06-11 46 views
4

我有兩個數組:jQuery的脫節

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

我想找出哪些元素是在陣列a但不是在陣列b哪些元素是b但不是在a

我知道一種方法是遍歷它們,但是有沒有更高效的方法?

謝謝你的時間。

回答

5

你可以嘗試以下方法:

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); 
+0

偉大的工作samjudson。真的很好,很短的問題解決方案。 – Bakhtiyor 2010-07-09 10:52:38

0

你可以先排序(a.sort()),然後它是一個簡單的迭代。

1

你要看看這兩個陣列中的每個元素,讓他們的區別。因此,有沒有其他方式比迭代兩個數組:

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; 
}; 

但是,排序這兩個數組也是成本。

1

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; 
}