Skip to content
Advertisement

Finding the symmetric difference in a loop

I need to write a function that can take an indefinite number of arrays containing integer numbers and it should return 1 array which is the accumulative symmetrical difference between those arrays. Only two arrays are compared at a time. So [1, 2, 3], [3, 4, 2], [1, 5, 3] would first result in [1, 4], (comparing the first two arrays), which is then compared to the third and the final result is [4, 5, 3]. I created a loop that does that for the first two arrays, but I don’t know how to turn it into an actual loop that performs the same operation on each step. For some reason using arr[i] and arr[i + 1] throws an error. Here’s my code so far.

function test(...arr) {
    let accumulator;
    for (let i = 0; i < arr.length; i++) {
        let common = arr[0].filter(a => arr[1].includes(a))
        let arr0 = arr[0].filter(a => !common.includes(a))
        let arr1 = arr[1].filter(a => !common.includes(a))
        let merged = [...arr0, ...arr1]
        accumulator = merged
    }
    return accumulator
}

console.log(test([1, 2, 3], [3, 4, 2], [1, 5, 3]))

Here accumulator is [1, 4], so at this point the entire operation needs to be performed with the next array and the accumulator, which is where I’m stuck at.

Advertisement

Answer

You’re iterating with i from 0 to arr.length - 1. arr[i + 1] is arr[arr.length] in the last iteration. It’s out of bounds. You could change the loop condition to i < arr.length - 1.

Example:

function test(...arr) {
    let accumulator;
    for (let i = 0; i < arr.length - 1; i++) {
        let common = arr[i].filter(a => arr[i + 1].includes(a))
        let arr0 = arr[i].filter(a => !common.includes(a))
        let arr1 = arr[i + 1].filter(a => !common.includes(a))
        let merged = [...arr0, ...arr1]
        accumulator = merged
    }
    return accumulator
}

console.log(test([1, 2, 3], [3, 4, 2], [1, 5, 3]))
User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement