如何在JavaScript中比较两个长度不同的数组,如果您不知道每个数组的长度?

6
我是卡在这个问题上了。我有两个数组,不知道每个数组的长度,它们可能相同也可能不同。我需要创建一个新数组,其中包含仅在第一个数组中或第二个数组中出现,但不同时在两个数组中出现的数字(范围在2到10之间)。
对于这种情况:
    var a = [2,4,10];
    var b = [1,4];

    var newArray = [];

    if(a.length >= b.length ){
        for(var i =0; i < a.length; i++){
            for(var j =0; j < b.length; j++){
                if(a[i] !=b [j]){
                    newArray.push(b);        
                }        
            }
        }
    }else{}  

我不知道为什么我的代码从未满足第一个条件,而且当b的长度大于a时我也不知道该怎么办。

你想在a比b短的时候有不同的行为吗?还是这只是试图让它工作? - BudgieInWA
这是一个尝试让它工作的努力。 - bentham
同样,两个数字相同但位置不同是否被视为相同? - BudgieInWA
是的,它们是相同的,我的意思只是2和10。 - bentham
在这种情况下,我下面的答案应该可以解决你的问题。请确认底部的澄清是否是您要寻找的结果。 - BudgieInWA
3个回答

16

如果我理解您的要求正确,那么您的代码似乎存在逻辑错误。

这段代码将把所有在a中但不在b中的元素放入newArray中。

var a = [2, 4, 10];
var b = [1, 4];

var newArray = [];

for (var i = 0; i < a.length; i++) {
    // we want to know if a[i] is found in b
    var match = false; // we haven't found it yet
    for (var j = 0; j < b.length; j++) {
        if (a[i] == b[j]) {
            // we have found a[i] in b, so we can stop searching
            match = true;
            break;
        }
        // if we never find a[i] in b, the for loop will simply end,
        // and match will remain false
    }
    // add a[i] to newArray only if we didn't find a match.
    if (!match) {
        newArray.push(a[i]);
    }
}

为了澄清,如果
a = [2, 4, 10];
b = [4, 3, 11, 12];

那么newArray将会是[2,10]


我弹出了newArray并得到了1,4,1,4。我仍在尝试,谢谢回答。我不知道为什么你的代码不起作用,你检查过你的代码了吗? - bentham
@Qeorge,我找到了错误。请将倒数第三行更改为newArray.push(a[i]);,就像我在我的编辑中所做的那样。 - BudgieInWA
@George,我鼓励你尝试理解代码为什么有效,以及为什么不需要检查哪个数组更长。思考一下你要解决的问题以及代码应该采取哪些步骤来获得解决方案。 - BudgieInWA
谢谢@BudgieInWA,还有什么建议吗?我正在努力理解你的代码,你是在哪里学到这些东西的? - bentham
"a.push(e)" 将会把 "e" 添加到数组 "a" 的末尾。 - BudgieInWA
显示剩余2条评论

2

试一下

var a = [2,4,10]; 
var b = [1,4]; 
var nonCommonArray = []; 
for(var i=0;i<a.length;i++){
    if(!eleContainsInArray(b,a[i])){
        nonCommonArray.push(a[i]);
    }
}

function eleContainsInArray(arr,element){
    if(arr != null && arr.length >0){
        for(var i=0;i<arr.length;i++){
            if(arr[i] == element)
                return true;
        }
    }
    return false;
}

谢谢回答,我已经接受了之前的答案,但让我再确认一下。 - bentham
@bentham 你是怎么找到这个的? - Magpie

2
我使用filter()include()方法找到了这个解决方案,非常简单易用。 filter()方法通过提供的函数实现测试,创建一个新数组,其中包含所有通过测试的元素。 includes()方法确定数组中是否包含某个特定值,并返回true或false。
function compareArrays(a, b) {
  return a.filter(e => b.includes(e));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接