Aerodynamika
Aerodynamika

Reputation: 8413

Check if the elements in array have been connected into a pair in Javascript

I have a problem that I can't seem to solve, maybe you can help.

There is an array I have. E.g. ['@dog','@cat','@mouse']

I want to reiterate through each value in that array and connect it to all the other values in that same array (through building a DB query).

However, because I'll be writing that in a database I need to avoid duplicates.

So if the @cat has been already connected to @mouse then by the time my for statement reaches the @mouse i want it to skip adding connection to @cat (and also to @dog because it was already connected on the first iteration to @mouse.

I've been trying with for loops, such as

for (var i=0; i<animals.length; i++) {
    for (var j = 0; j<animals.length; j++) {
        if (animals[i] !== animals[j]) {
            // adds connection between animals[i] and animals[j]
        }
    }
}

But what's the best way to implement a check of the already existing pairs? (where it doesn't matter which element is the first, which is the second - e.g. my graph is not unidirectional).

This especially becomes a problem if I'm going to have more than 4 elements in the array...

Thank you for your help!

Upvotes: 1

Views: 239

Answers (2)

Bergi
Bergi

Reputation: 664548

In the inner loop, you only want to make connections to elements not yet visited by the outer loop:

for (var i=0; i<animals.length; i++) {
    for (var j = i+1; j<animals.length; j++) {
//               ^^^
        // adds connection between animals[i] and animals[j]
    }
}

That way you won't get duplicate edges (assuming that animals itself is duplicate-free)

Upvotes: 1

Raphael Serota
Raphael Serota

Reputation: 2197

for (var i=0; i<animals.length; i++) {
    for (var j = 0; j<i; j++) {
        if (animals[i] !== animals[j]) {
            // adds connection between animals[i] and animals[j]
        }
    }
}

This way, each element of the array is only compared against those before it in the array. I think this is much closer to what you want.

Upvotes: 1

Related Questions