1

need for some guide here please: what I´m doing is creating a new multidimensional array of objects starting from an array of objects:

[
{number:111, connectedNumber: 112, ...},
{number:112, connectedNumber: 111, ...},
{number:113, connectedNumber: 114, ...},
{number:114, connectedNumber: 113, ...}
....
]

So at the end, I need to get a new multidimensional array with groups of related objects:

[
   [{number:111, connectedNumber: 112, ...}, {number:112, connectedNumber: 111, ...}],
   [{number:113, connectedNumber: 114, ...}, {number:114, connectedNumber: 113, ...}],
]

As you can see, they are related with the number === connecetedNumber.

Until now what I´m doing is creating a new array and looping trough the original list of objects and check if number === connecetedNumber and added to the new array:

for (let j = count; numbers.length > j; j++) {
            organizedNumber.push([numbers[j]]);

            for (let k = j; numbers.length > k; k++) {
                if (numbers[j].number === numbers[k].connectedNumber) {
                   organizedNumber[j].push(numbers[k]);
                }
            }
        }

but this return a new array in this format:

[
   [{number:111, connectedNumber: 112, ...}, {number:112, connectedNumber: 111, ...}],
   [{number:112, connectedNumber: 111, ...}],
   [{number:113, connectedNumber: 114, ...}, {number:114, connectedNumber: 113, ...}],
   [{number:114, connectedNumber: 113, ...}],
....
]

As you can see the loop it´s running over each element (As expected), and adds the next element that it´s already added in the previous array.

Any guide here please.

4
  • 1
    could you please clarify what is the desired input and output with few elements? It's not entirely clear from your long example. Commented Mar 28, 2019 at 16:09
  • Do you know that there will always be pairs in the original data -- i.e. no orphans? Commented Mar 28, 2019 at 16:15
  • do you have always number first and then follows connectedNumber? or could it be in random order? Commented Mar 28, 2019 at 16:16
  • Looks like you've got a graph and want to split it into components. See en.wikipedia.org/wiki/Component_(graph_theory) for a basic algorithm. Commented Mar 28, 2019 at 18:03

1 Answer 1

2

You could look for the wanted group and add the object to it or create a new group.

var data = [{ number: 111, connectedNumber: 112 }, { number: 112, connectedNumber: 111 }, { number: 113, connectedNumber: 114 }, { number: 114, connectedNumber: 113 }],
    grouped = data.reduce((r, o) => {
        const
            caseA = a => a.some(({ number }) => o.connectedNumber === number),
            caseB = a => a.some(({ connectedNumber }) => o.number === connectedNumber),
            temp = r.find(caseA) || r.find(caseB) || [];

        if (!temp.length) r.push(temp);
        temp.push(o);
        return r;
    }, []);

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Sign up to request clarification or add additional context in comments.

1 Comment

Great!, Thanks @Nina Scholz

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.