jQuery 不相交
Posted
技术标签:
【中文标题】jQuery 不相交【英文标题】:jQuery Disjoint 【发布时间】: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
中?
我知道一种方法是遍历它们,但是有没有更有效的方法?
感谢您的宝贵时间。
【问题讨论】:
【参考方案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()
),然后进行简单的迭代。
【讨论】:
以上是关于jQuery 不相交的主要内容,如果未能解决你的问题,请参考以下文章