【发布时间】: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
我有两个数组:
var a = new Array(1,2,3,4);
var b = new Array(5,3,2,6);
我想找出哪些元素在数组a 中但不在数组b 中,哪些元素在b 中但不在a 中?
我知道一种方法是遍历它们,但是有没有更有效的方法?
感谢您的宝贵时间。
【问题讨论】:
标签: javascript jquery arrays
您可以尝试以下方法:
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);
【讨论】:
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;
}
【讨论】:
您必须查看两个数组的每个元素以了解它们的区别。所以除了迭代两个数组别无他法:
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;
};
但是对两个数组进行排序也需要花费。
【讨论】:
您可以先对它们进行排序 (a.sort()),然后进行简单的迭代。
【讨论】: