Вы можете использовать две таблицы хэша, одну для элементов и их groups
и для результата sets
.
В основном алгоритм генерирует для той же группы объект со свойством и массивом, поскольку он позволяет сохранить ссылку на объект при назначении нового массива.
Основная часть - итерация внешнего массива, а затем внутренних массивов и проверка внутри, если это первый элемент, затем проверьте хеш-таблицу на наличие и если она не существует, сгенерируйте новый объект со свойством values ??и пустой массив как значение , Также назначьте фактический объект с sets
помощью элемента как ключа.
На следующем шаге хэш-таблица снова проверяется, а если нет, то назначьте объект первого элемента.
Для сохранения только уникальных значений выполняется проверка, и если элемент не существует, элемент переносится в массив значений хэш-таблицы.
Затем часть для объединения массивов следует проверять, если объект первого элемента не равен объекту фактического элемента. Если это так, он удаляет из sets
ключа из первого элемента значения фактических элементов и объединяет массив фактических элементов с значениями объекта первого элемента. Затем объект значений присваивается объекту фактического объекта.
Позже sets
они сопоставляются с результирующим набором с итерированием sets
объекта, а свойство values ??принимается за значение.
var array = [[1, 2], [3, 4], [1, 3], [5, 6], [6, 5]],
groups = {},
sets = {},
result;
array.forEach(function (a) {
a.forEach(function (b, i, bb) {
if (i === 0 && !groups[b]) {
groups[b] = { values: [] };
sets[b] = groups[b];
}
if (!groups[b]) {
groups[b] = groups[bb[0]];
}
if (groups[b].values.indexOf(b) === -1) {
groups[b].values.push(b);
}
if (groups[bb[0]] !== groups[b]) {
delete sets[groups[b].values[0]];
groups[bb[0]].values = groups[bb[0]].values.concat(groups[b].values);
groups[b].values = groups[bb[0]].values;
}
});
});
result = Object.keys(sets).map(function (k) {
return sets[k].values;
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }