我有两个数组:
var a = new Array(1,2,3,4);
var b = new Array(5,3,2,6);
我想找出数组a
但数组b
中的哪些元素以及哪些元素位于b
而不是a
?
我知道一种方法是逐个遍历它们,但是有更有效的方法吗?
感谢您的时间。
答案 0 :(得分: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);
答案 1 :(得分: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;
};
但是对两个阵列进行排序也会产生费用。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
你可以先对它们进行排序(a.sort()
),然后这是一个简单的迭代。