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

时间:2012-07-07 13:13:32

标签: jquery

我有两组数组。我需要得到不在两个数组中的字母。首先,它应检查索引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

 <p class="arrayA">Array A</p>
 <p class="arrayB">Array B</p>
 <p class="arrayC">Array C</p>

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);
});

5 个答案:

答案 0 :(得分:4)

这没有记录,但它确实有效..

<script type="text/javascript">
    var arr1=[1,2,3,4,5];
    var arr2=[3,4,5,7,8,9,6];
    $(document).ready(function(){
        var arr=$(arr1).not(arr2).get();
        alert(arr.length);
    });
</script>

答案 1 :(得分:2)

这是您想要的工作版本: 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,因此如果您以后再次需要它们,则必须克隆它们。

答案 2 :(得分:1)

一个vanilla JavaScript解决方案:

var sa = arrayA.join('');
var sb = arrayB.join('');
var sc = sa+sb;
for (var i=0; i<sc.length;i++) {
   var c = sc.charAt(i);
   if (sa.indexOf(c)==-1 || sb.indexOf(c)==-1) arrayC.push(c);
}

使用jQuery,您还可以使用inArray

var sc = arrayA.join('')+arrayB.join('');
for (var i=0; i<sc.length;i++) {
   var c = sc.charAt(i);
   if ($.inArray(c, arrayA)==-1 || $.inArray(c, arrayB)==-1) arrayC.push(c);
}

如Random所述,结果不是[“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无关。我不明白你想要什么。我放弃但是我留下了这个答案(至少目前为止),因为它回答了第一个问题并且可能有用。

答案 3 :(得分:1)

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 );

<强> Working sample

答案 4 :(得分:0)

查看不同的演示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 array difference

   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);
​