Вы должны посмотреть на каждый элемент обоих массивов, чтобы получить их разницу. Так что нет другого способа, кроме как итерировать оба массива:
Array.prototype.diff = function(otherArray) {
var diff = [], found;
for (var i=0; i<this.length; i++) {
found = false;
for (var j=0; j<otherArray.length; j++) {
if (this[i] == otherArray[j]) {
found = true;
break;
}
}
if (!found) {
diff.push(this[i]);
}
}
return diff;
};
var a = [1,2,3,4],
b = [5,3,2,6];
var aDiffB = a.diff(b),
bDiffA = b.diff(a);
Вы можете пропустить некоторые сравнения, когда массивы отсортированы, и начать с внутреннего цикла с элементом после последнего соответствия и разбить его, если значение больше:
Array.prototype.diff = function(otherArray) {
var diff = [], found, startAt = 0,
a = this.sort(),
b = otherArray.sort();
for (var i=0; i<a.length; i++) {
found = false;
for (var j=startAt; j<b.length; j++) {
if (a[i] > b[j]) {
break;
}
if (a[i] == b[j]) {
found = true;
startAt = j + 1;
break;
}
}
if (!found) {
diff.push(a[i]);
}
}
return diff;
};
Но сортировка обоих массивов также стоит.