相同的循环似乎不起作用

时间:2016-10-26 22:28:42

标签: javascript arrays algorithm

我试图解决免费代码营的编码挑战。

Diff Two Arrays

比较两个数组并返回一个新数组,其中只有在两个给定数组之一中找到的任何项,但不能同时返回两个数组。换句话说,返回两个数组的对称差异。

[1,2,3,5],[1,2,3,4,5]应该返回[4]。

[1,"小牛",3,"小猪"],[1,"小牛",3,4]应该返回[& #34; piglet",4]。

我的代码如下:

 function diffArray(arr1, arr2) {
        var arr1Key = [];
        arr1Key = arr1;

        for (i = arr1.length - 1; i >= 0; i--) {
            for (j = 0; j < arr2.length; j++) {
                if (arr1[i] === arr2 [j]) {
                    arr1.splice(i, 1);
                }
            }
        }

        for (k = arr2.length - 1; k >= 0; k--) {
            for (l = 0; l < arr1Key.length; l++) {
                if (arr2[k] === arr1Key[l]) {
                    arr2.splice(k, 1);
                }
            }
        }

        var newArr = [];
        newArr = arr1.concat(arr2);
        return (newArr)
    }

    diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]);

我知道它可能不是完美/最佳,但我最想知道的是为什么我的第一个for循环系列(使用i&amp; j)完美无缺。同时,我的下一系列for循环(使用k&amp; l)是第一个几乎相同的副本,但经过一些测试后我发现只有k for循环才有效。 l for循环不起作用,我不明白为什么。

我一直在盯着这件事,并因为永远感觉而修补它,我只是不明白。

2 个答案:

答案 0 :(得分:1)

您在循环遍历数组时拼接数组,拼接可以使它们增长或缩小,而您不希望这样,因为您使用数组的length来循环。

答案 1 :(得分:1)

问题在于您认为通过编写arr1

来克隆arr1Key = arr1;

这不会克隆,但会创建对arr1的引用,因此arr1.splice(i, 1);也会更改arr1Key

只需将第arr1Key = arr1;行更改为arr1Key = arr1.slice();

即可