Создайте многомерный массив объектов без дубликатов - PullRequest
2 голосов
/ 28 марта 2019

Мне нужно какое-то руководство, пожалуйста: я создаю новый многомерный массив объектов, начинающийся с массива объектов:

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

Итак, в конце мне нужно получить новыймногомерный массив с группами связанных объектов:

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

Как вы можете видеть, они связаны с number === connecetedNumber.

До сих пор я занимаюсь созданием нового массива изацикливание в исходном списке объектов и проверка number === connecetedNumber и добавление нового массива:

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

, но это возвращает новый массив в следующем формате:

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

Как выможет видеть цикл, выполняемый над каждым элементом (как и ожидалось), и добавляет следующий элемент, который уже добавлен в предыдущий массив.

Любое руководство здесь, пожалуйста.

1 Ответ

3 голосов
/ 28 марта 2019

Вы можете найти нужную группу и добавить в нее объект или создать новую группу.

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; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...