5
\$\begingroup\$

This (working) code is supposed to return a new array that consists of elements of both arrays that were not marked as duplicates (find duplicates in both arrays, remove such elements from both arrays and create an array from the leftovers, if any)

Is there a way to simplify this function?

function diff(arr1, arr2) {
    var arr1_filtered, arr2_filtered;

    arr1_filtered = arr1.filter(function (v) {
        return arr2.indexOf(v) == -1;
    });

    arr2_filtered = arr2.filter(function (v) {
        return arr1.indexOf(v) == -1;
    });

    return arr1_filtered.concat(arr2_filtered);
}
\$\endgroup\$
  • \$\begingroup\$ Do you want to remove duplicate from resulting array too? \$\endgroup\$ – Tushar Nov 20 '15 at 8:50
  • \$\begingroup\$ yes, from both of them and then combine non-duplicates in one new array \$\endgroup\$ – Alex Bykov Nov 20 '15 at 8:56
2
\$\begingroup\$

Create a function on Array.prototype that'll accept an array and filter the array by checking if the element is in the other array.

// Define a function on Array prototype
Array.prototype.arrayDiff = function (arr) {
    return this.filter(function (v) {
        return arr.indexOf(v) === -1;
    });
};

function diff(arr1, arr2) {
    // 1. Remove elements that are in arr2 from arr1
    //    i.e. arr1.arrayDiff(arr2)
    // 2. Remove elements that are in arr1 from arr2
    //    i.e. arr2.arrayDiff(arr1)
    // 3. Concat the result of both the arrays

    return arr1.arrayDiff(arr2).concat(arr2.arrayDiff(arr1));
}

// Define a function on Array prototype
Array.prototype.removeDuplicates = function(arr) {
  return this.filter(function(v) {
    return arr.indexOf(v) === -1;
  });
};

function diff(arr1, arr2) {
  return arr1.removeDuplicates(arr2).concat(arr2.removeDuplicates(arr1));
}

var arr = diff([1, 3, 4, 2, 5], [2, 45, 7, 42, 1, 6]);
document.write(JSON.stringify(arr));

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.