JavaScript: разбить многомерный массив на дубликаты - PullRequest
0 голосов
/ 03 октября 2018

Я застрял с разбиением массива на несколько частей на основе пар и дубликатов.

У меня есть этот массив:

var array = [[24, 17],[45, 17],[17, 24],[38, 31],[31, 38],[17, 45]];

, и мне нужно разделить его, чтобы получить это:

var array = [[24,17,45],[38,31]];

Кто-нибудь имеет представление о правильном способе сделать это?Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

0 голосов
/ 03 октября 2018

Вы можете сгладить массив путем распространения в Array.concat(), а затем уменьшить массив.Используя помощника Set, добавьте новый подмассив при обнаружении дубликата.Затем отфильтруйте пустые массивы:

const array = [[24, 17],[45, 17],[17, 24],[38, 31],[31, 38],[17, 45]];

const helperSet = new Set();
const result = [].concat(...array)
  .reduce((r, n) => {
    !r[r.length - 1] && r.push([]);
    
    if(!helperSet.has(n)) {
      r[r.length - 1].push(n)
      helperSet.add(n);
    } else {
      r.push([]);
    };
  
    return r;
  }, [])
  .filter(({ length }) => length);

console.log(result);
0 голосов
/ 03 октября 2018

Вы можете использовать хеш-таблицу, которая отображает определенную сетку на столкновение, поэтому вы можете легко сгруппировать их:

const array = [[24, 17],[45, 17],[17, 24],[38, 31],[31, 38],[17, 45]];

const result = [], hash = {};

 for(const [a, b] of array) {
  let group = hash[a] || hash[b] || (arr => (result.push(arr), hash[a] = hash[b] = arr))([]);
  if(!group.includes(a)) group.push(a);
  if(!group.includes(b)) group.push(b);
}

console.log(result);
0 голосов
/ 03 октября 2018

Вы можете взять мощность Set и проверить, находится ли одно из значений в одном наборе.Если нет, создайте новый набор результатов с новым набором.

var array = [[24, 17], [45, 17], [17, 24], [38, 31], [31, 38], [17, 45]],
    result = array
        .reduce((r, a) => {
            var s = r.find(s => a.some(Set.prototype.has, s));
            if (s) {
                a.forEach(v => s.add(v));
            } else {
                r.push(new Set(a));
            }
            return r;
        }, [])
        .map(s => Array.from(s));
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...