Mauro
Mauro

Reputation: 1481

Create a multidimensional array of objects without duplicate items

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.

Upvotes: 1

Views: 62

Answers (1)

Nina Scholz
Nina Scholz

Reputation: 386883

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; }

Upvotes: 2

Related Questions