我有兩個數組:jQuery的脫節
var a = new Array(1,2,3,4);
var b = new Array(5,3,2,6);
我想找出哪些元素是在陣列a
但不是在陣列b
哪些元素是b
但不是在a
?
我知道一種方法是遍歷它們,但是有沒有更高效的方法?
謝謝你的時間。
我有兩個數組:jQuery的脫節
var a = new Array(1,2,3,4);
var b = new Array(5,3,2,6);
我想找出哪些元素是在陣列a
但不是在陣列b
哪些元素是b
但不是在a
?
我知道一種方法是遍歷它們,但是有沒有更高效的方法?
謝謝你的時間。
你可以嘗試以下方法:
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);
你可以先排序(a.sort()
),然後它是一個簡單的迭代。
你要看看這兩個陣列中的每個元素,讓他們的區別。因此,有沒有其他方式比迭代兩個數組:
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;
};
但是,排序這兩個數組也是成本。
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;
}
偉大的工作samjudson。真的很好,很短的問題解決方案。 – Bakhtiyor 2010-07-09 10:52:38