2

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

var arrayA = ['a','b','c','a'];

var arrayB = ['a','d','f','c'];

var 数组 C = []; //应该有结果[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);
});
4

5 回答 5

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>
于 2013-05-14T06:53:35.307 回答
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);

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

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

​</p>

于 2012-07-07T15:00:13.347 回答
1

一个普通的 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]);
   }
}   

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

于 2012-07-07T13:18:33.747 回答
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 );

工作样本

于 2012-07-07T15:23:06.963 回答
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 数组差异

   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);
​
于 2012-07-07T13:33:22.577 回答