比较两个数组并获取非重复(非唯一)值

我有两组数组。 我需要得到不在两个数组中的字母。 首先,它应该检查索引0’a’是否在两个数组上。 如果两者都应该从两者中删除’a’(只是第一个数组中的第一个’a’而不是结尾的那个(索引3)。然后使用相同的逻辑去第二个项’b’。

var arrayA = [‘a’,’b’,’c’,’a’];

var arrayB = [‘a’,’d’,’f’,’c’];

var arrayC = []; // Shoud有结果[b,a,d,f]

代码在http://jsfiddle.net/rexonms/AbFYh/#base上设置

HTML

Array A

Array B

Array C

jQuery

 var arrayA = ['a','b','c','a']; var arrayB = ['a','d','f','c']; var arrayC = []; //Shoud have the result[b,a,d,f] $('.arrayA').text('ArrayA: ' + arrayA); $('.arrayB').text('ArrayB: ' + arrayB); $.each(arrayA, function(indexA,valueA) { $.each(arrayB, function(indexB, valueB){ if(valueA != valueB) { arrayC.splice(valueA); } }); $('.arrayC').text('ArrayC: ' + arrayC); }); 

这是你想要的工作版本: http : //jsfiddle.net/Zzt5f/

 var arrayA = ['a','b','c','a']; var arrayB = ['a','d','f','c']; var arrayC = []; //Should have the result[b,a,d,f] $('.arrayA').text('ArrayA: ' + arrayA); $('.arrayB').text('ArrayB: ' + arrayB); $.each(arrayA, function(indexA,valueA) { $.each(arrayB, function(indexB, valueB){ if(valueA == valueB) { arrayA[indexA]=null; arrayB[indexB]=null; return false; //break out of inner each loop } }); }); $.each(arrayA.concat(arrayB),function(idx,val) { if(val!=null) arrayC.push(val); }); $('.arrayC').text('ArrayC: ' + arrayC); alert(arrayC); 

如您所见,我只对您的原始代码进行了一些修改。 首先,由于您尝试删除重复值,因此需要检查valueA==valueB ,反之亦然。 一旦找到匹配,第二次迭代需要停止以防止删除第二个数组中的第二个副本,因此return false

我没有使用array.splice方法,因为它实际上通过从调用它的数组中删除值来创建并返回一个新数组,所以基本上它没有像你使用它那样做任何事情。 不继续在循环中创建新数组感觉更干净。 请注意,此方法实际上会修改arrayAarrayB ,因此如果以后再次需要它们,则必须克隆它们。

这没有记录,但它的工作原理..

  
 var arrayA = ['a', 'b', 'c', 'a']; var arrayB = ['a', 'd', 'f', 'c']; var result = []; function myArray( a, b ) { for( var i = 0; i < a.length; ++i ) { // find matched index of arrayB var bIndex = b.indexOf(a[i]); // if match found if( bIndex >= 0 ) { // remove element from arrayA a.splice( i, 1 ); // remove element from arrayB of matched index b.splice( bIndex, 1 ); } } // return result return a.concat(b); } result = myArray( arrayA, arrayB ); 

工作样本

一个vanilla JavaScript解决方案:

 var sa = arrayA.join(''); var sb = arrayB.join(''); var sc = sa+sb; for (var i=0; i 

使用jQuery,您还可以使用inArray :

 var sc = arrayA.join('')+arrayB.join(''); for (var i=0; i 

如随机所指出的,结果不是[“b”,“a”,“d”,“f”],而是[“b”,“d”,“f”]两种解决方案。

如果你想将“unicity”定义为“在同一索引的另一个数组中不存在”,那么它是:

  for (var i=Math.min(arrayA.length, arrayB.length); i-->0;) { if (arrayA[i]!=arrayB[i]) { if ($.inArray(arrayA[i], arrayC)==-1) arrayC.push(arrayA[i]); if ($.inArray(arrayB[i], arrayC)==-1) arrayC.push(arrayB[i]); } } 

编辑:我已经阅读了您的编辑的新定义。 这似乎与unicity无关。 我不明白你想要什么。 我放弃但是我留下了这个答案(至少目前为止),因为它回答了第一个问题并且可能有用。

看点 不同的演示 : http : //jsfiddle.net/c8YLf/ http://jsfiddle.net/S6FXs/5/

 var a= ['a','b','c','a']; var b= ['a','d','f','c']; var unique = $.grep(a, function(element) { return $.inArray(element, b) == -1; }); var unique2 = $.grep(b, function(element) { return $.inArray(element, a) == -1; }); var result = unique + unique2; alert(result); ​ 

或者可能有所帮助: JavaScript数组差异

  var arrayA = ['a','b','c','a']; var arrayB = ['a','d','f','c']; function non_duplicate(arr1, arr2) { diff = []; joined = arr1.concat(arr2); for( i = 0; i <= joined.length; i++ ) { current = joined[i]; if( joined.indexOf(current) == joined.lastIndexOf(current) ) { diff.push(current); } } return diff; } var union = non_duplicate(arrayA,arrayB ); alert(union);​