如何比较两个数组然后把不同的元素放到另一个数组里?

我有两个数组:

假如数组arr1中元素为1,2,3,4

数组arr2中元素为1,3,4

如何能通过JS把arr1和arr2中不同的元素2,给放到arr3这个数组里?有时候可能arr2中元素比arr1中元素多。

建hash,key为元素 value 为命中 初始为1
A所有元素放入hash 中并增加此key 命中*2
B所有元素放入hash 中并增加此key 命中*5
最后 如果尾数为0 则去掉.

[code="java"] function a (){
var arr1=[1,3,4];
var arr2=[1,2,4];
var arr3=[];
var hash3 = {} ;
for(var index in arr1){
var i = arr1[index];
var temp = hash3[""+i];
if(!temp){
hash3[""+i]=2;
}else{
hash3[""+i] = temp*2;
}
}
for(var index in arr2){
var i = arr2[index];
var temp = hash3[""+i];
if(!temp){
hash3[""+i]=5;
}else{
hash3[""+i] = temp*5;
}
}
for(var i in hash3 ){
var temp = hash3[""+i];
if(temp%10!=0){
arr3.push(i)
}
}
return arr3;

}
alert(a());[/code]



如何比较两个数组然后把不同的元素放到另一个数组里
<script src="jquery-1.7.1.min.js"></script>

<script>



    // arr1
    var arr1 = [1,2,3,4,5,6];
    // arr2
    var arr2 = [3,4,5,6];

    // 测试一
    alert(getOnSameItem(arr1, arr2));



    var arr3 = [1,2];
    var arr4 = [1,3,4,5];
    // 测试二
    alert(getOnSameItem(arr3, arr4));






    // 获取两个数据中不同的元素
    function getOnSameItem(arr1, arr2){
        var arr4 = new Array();
        var sameArray = getSameItem(arr1, arr2);
        // 删除数组一中相同的元素
        for(var i=0;i<arr1.length;i++){
            for(var j=0;j<sameArray.length;j++){
                if(arr1[i]==sameArray[j]){
                    arr1.splice(i, 1);
                }
            }
        }
        // 删除数组二中相册的元素
        for(var i=0;i<arr2.length;i++){
            for(var j=0;j<sameArray.length;j++){
                if(arr2[i]==sameArray[j]){
                    arr2.splice(i, 1);
                }
            }
        }
        arr4.push(arr1);
        arr4.push(arr2);
        return arr4;
    }

    // 获取两个数组中相同的元素
    function getSameItem(arr1, arr2){
        var arr3 = new Array();
        // 遍历数组一与数组二添加数组一中的相同元素
        for(var i=0;i<arr1.length;i++){
            for(var j=0;j<arr2.length;j++){
                if(arr1[i]==arr2[j]){
                    arr3.push(arr1[i]);
                }
            }
        }
        // 遍历数组二与数组一添加数组二中的相同元素
        for(var i=0;i<arr2.length;i++){
            for(var j=0;j<arr1.length;j++){
                if(arr2[i]==arr1[j]){
                    arr3.push(arr2[i]);
                }
            }
        }
        return arr3;
    }
</script>

:D 上面保存成html格式,再格式化下,贴上的代码格式没有了.不好意思. :D

对楼上的解答有几处不明白的地方:
1、getSameItem()方法里面,为什么有两个循环,找出相同的一个不够?
2、getOnSameItem()方法中,使用arr1.splice(i, 1); 不仅会影响到原来的数组arr1,而且效率很低。

3、getOnSameItem()方法中的arr4.push(arr1); 和arr4.push(arr2);拼凑在一起没有使得数组元素并列,最终结构是arr4=[[1,2],[3,4]]

因此我也给出一个解答:
var arr1 = [1,4,6];
var arr2 = [1,2,3];
var arrSame = getSameArr(arr1, arr2);
var arrAll = arr1.concat(arr2);
var arrDiff = getDiffArr(arrAll, arrSame);
alert(arrDiff);

function getSameArr(arr1, arr2) {
    return getSameOrDiffArr(arr1, arr2, true);
}

function getDiffArr(arr1, arr2) {
    return getSameOrDiffArr(arr1, arr2, false);
}
// 此处的getSameOrDiffArr整合了same和diff方法,所以看起来比较丑陋,你可以自己再分开
function getSameOrDiffArr(arr1, arr2, isGetSame) {
    var arrRet = [];
    for (var i = 0, len = arr1.length; i < len; i++) {
        if (isGetSame && isExistArr(arr1[i], arr2)) {
                arrRet.push(arr1[i]);
        }
        else if (!isGetSame && !isExistArr(arr1[i], arr2)) {
                arrRet.push(arr1[i]);
        }
    }
    return arrRet;
}

function isExistArr(strCmp, arrSrc) {
    if (strCmp) {       
        for (var i = 0, len = arrSrc.length; i < len; i++) {
            if (strCmp == arrSrc[i]) {
                return true;
            }
        }
    }
    return false;
}

这里有个可优化之处,getSameArr的时候,实际上可以把其中一个的different找出来,这样能省去后来的部分循环。
不过这样做了,getSameArr就不好封装成方法,如下:
var arr1 = [1,4,6];
var arr2 = [1,2,3];
var arrSame = [];
var arrDiff = [];

for (var i = 0, len = arr1.length; i < len; i++) {
    if (isExistArr(arr1[i], arr2)) {
        arrSame.push(arr1[i]);
    }
    else {
        arrDiff.push(arr1[i]);
    }
}

for (var i = 0, len = arr2.length; i < len; i++) {
    if (!isExistArr(arr2[i], arrSame)) {
        arrDiff.push(arr2[i]);
    }
}

alert(arrDiff);

function isExistArr(strCmp, arrSrc) {
    if (strCmp) {       
        for (var i = 0, len = arrSrc.length; i < len; i++) {
            if (strCmp == arrSrc[i]) {
                return true;
            }
        }
    }
    return false;
}

希望能帮到lz :)

思路大致如下:
[code="js"]
var arr1 = [1,2,3,4],
arr2 = [1,3,4],
arr3 = [],
obj = {};
for(var i=0,len=arr1.length; i<len; i++){
obj[arr1[i]] = 1;
}
for(var j=0,jlen=arr2.length; j<jlen; j++){
if(obj[arr2[j]]){//存在则置为2
obj[arr2[j]] = 2;
}
}
for(var key in obj){
if(obj[key] == 1){
arr3.push(key);
}
}

alert(arr3.join(","));

[/code]

[code="jsp"]
function intersect(arr1,arr2){
var obj=new Object();
var arr3=new Array();
for (var i=0;i<arr1.length;i++){
eval("obj.pro"+arr1[i]+"='"+arr1[i]+"';");
}
for(var i=0;i<arr2[0].length;i++)
{
if(eval("typeof obj.pro"+arr2[i]+"!='undefined'")){
arr3.push(arr2[i]);
}
}
return arr3;
}
[/code]
大致是这样的,通过判断object是否已经被赋值来判断是否相同