2

假设我们有 2 个数组说:

 A [] => 1 2 3 4 5

 B [] => 1 2 7 4 5 

在这种情况下,jQuery 中是否有任何方法可以提供 2 个数组的不匹配值:

 Result [] => 3 7
4

6 回答 6

2

答案:没有。

解决方案:使用标准的 javascript 循环。

var nomatches = [];
for (var i=Math.min(A.length, B.length); i-->0;) {
   if (A[i]!=B[i]) {
       nomatches.push(A[i]);
       nomatches.push(B[i]);
   }
}
// do what you want with remaining items if A.length != B.length

如果按照 Rory 的假设,您不想匹配数组而是逻辑集,则可以这样做:

 var nomatches = [];
var setA = {};
var setB = {};
for (var i=A.length; i-->0;) setA[A[i]]=1;
for (var i=B.length; i-->0;) setB[B[i]]=1;
for (var i=A.length; i-->0;) {
    if (!setB[A[i]]) nomatches.push(A[i]);
}
for (var i=B.length; i-->0;) {
    if (!setA[V[i]]) nomatches.push(B[i]);
}
于 2012-05-26T10:59:14.750 回答
2

在这里工作演示: http : //jsfiddle.net/mbKfT/

好读 http://api.jquery.com/jQuery.inArray/

这用于inArray检查元素是否存在,如果不将其添加到intersect数组中。

其余演示将消除任何疑问:)

代码

var a1 = [1,2,3,4,5];
var a2 = [1,2,7,4,5];
var intersect = [];

$.each(a1, function(i, a1val) {

    if ($.inArray(a1val, a2) === -1) {   
        intersect.push(a1val);
    }
});

$.each(a2, function(i, a1val) {

    if ($.inArray(a1val, a1) === -1) {           
        intersect.push(a1val);
    }
});
$("div").text(intersect);
alert(intersect + " -- " + matches);

​
于 2012-05-26T11:17:26.940 回答
1

jQuery.inArray()会有所帮助:

var a = [1,2,3,4,5], b=[1,2,7,4,5];

var ret = 
a.filter(function(el) {
  return $.inArray(el, b) === -1;
}).concat(
b.filter(function(el) {
  return $.inArray(el, a) === -1;    
})
);
console.log(ret);

演示。_

PS:或者你可以只使用b.indexOf(el) === -1,那么你就不再需要 jQuery 了。

于 2012-05-26T11:11:39.890 回答
1
var nomatch = [], Bcopy = B.slice(0);
for (var i = 0, j; i < A.length; i++) {
    j = Bcopy.indexOf(A[i]);
    if (j === -1) nomatch.push(A[i]);
    else Bcopy.splice(j, 1);
}
nomatch.push.apply(nomatch, Bcopy);

笔记:

  1. 此代码假定A和中的项目B是唯一的。
  2. indexOffor 数组必须在 IE8 和以前的版本中模拟。
于 2012-05-26T11:14:52.773 回答
0
function getUnique(A, B){
  var res = [];
  $.grep(A, function(element) {
    if($.inArray(element, B) == -1) res.push(element)        
  });
  $.grep(B, function(element) {
    if($.inArray(element, A) == -1) res.push(element);    
  });
  return res;
}

利用:

var A = [1,2,3,4,5],
    B = [1,2,3,5,7];

getUnique(A, B);

演示

于 2012-05-26T11:04:27.180 回答
0

这是现代浏览器的另一种解决方案(单行,是的!):

var a = [1, 2, 3, 4, 5];
var b = [1, 2, 7, 4, 5];

var result = a.concat(b).filter(function(el, i) {
    return (i < a.length ? b : a).indexOf(el) == -1;
});

演示:http: //jsfiddle.net/6Na36/


如果您还希望保留索引检查,则可以使用此变体:

var a = [1, 2, 3, 4, 5];
var b = [1, 2, 7, 4, 5];

var result = a.concat(b).filter(function(el, i, c) {
    return el != c[i < a.length ? i + a.length : i - a.length];
});

演示:http: //jsfiddle.net/6Na36/1/

请注意,这两种变体都能成功处理不同大小的数组。

于 2012-05-26T11:46:28.810 回答