Этот комментарий быстро объясняет, что делал ваш код:
@Crystal, first double loop: at i=0 k=0 "one"=="one" so each is removed; at i=0 k=1 "two"!="three"; at i=0 k=2 "two"!="four"; at 0 3 "two"!="five"; 1 0 "three"!="two"; 1 1 "three"=="three" so each is removed; 1 2 "four"!="five"; no more cycles. In the second double loop: 0 0 "two"=="two" so each is removed; 0 1 is not run because at this point a1 only has "four" so a1.length==1. Thus we concat "four" in a1 with "four" and "five" in a2
Чтобы получить нужный ответ, измените
a1.splice(i, 1);
на
a1.splice(i--, 1);
Ипромойте, повторите для других 3 аналогичных случаев в двойных петлях.Таким образом, у вас будет 4 случая использования соединения и уменьшения на один его первый аргумент.Это уменьшение компенсирует удаление соединения.
Однако теперь вам нужен только один из двойных циклов, поскольку он удалит все перекрытия.
Кроме того, почему у вас есть проверка сверхуотфильтровать случаи, когда длина a1 больше или равна длине a2?Удалите и этот раздел.
Ответ будет "пять".При желании вы можете протестировать очень разные данные, и они должны работать.
Так что это может быть ваша программа:
function diff(a1, a2) {
a1 = a1.slice(0);
a2 = a2.slice(0);
for (i = 0; i < a1.length; i++) {
for (k = 0; k < a2.length; k++) {
if (a1[i] == a2[k]) {
a1.splice(i--, 1);
a2.splice(k--, 1);
}
}
}
a1 = a1.concat(a2);
return a1;
}
var s1 = ["one", "two", "seven", "three", "four",];
var s2 = ["one", "two", "four", "five", "six"];
document.write(diff(s1, s2));