我试图解决免费代码营的编码挑战。
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循环不起作用,我不明白为什么。
我一直在盯着这件事,并因为永远感觉而修补它,我只是不明白。
答案 0 :(得分:1)
您在循环遍历数组时拼接数组,拼接可以使它们增长或缩小,而您不希望这样,因为您使用数组的length
来循环。
答案 1 :(得分:1)
问题在于您认为通过编写arr1
arr1Key = arr1;
这不会克隆,但会创建对arr1
的引用,因此arr1.splice(i, 1);
也会更改arr1Key
。
只需将第arr1Key = arr1;
行更改为arr1Key = arr1.slice();