Сортировка массивов

210
20 апреля 2017, 17:04

Входящие данные : двухмерный массив

[
 [2,3,4,5],
 [3,2,4,5],
 [2,3,8,5],
 [6,1,23,5],
 [2,1,23,5],
 [6,8,2,2]
]

Нужно найти массивы с одинаковыми первыми элементами (в данном случае c (2))

[2,3,4,5]
[2,1,23,5]
[2,3,8,5]
[6,1,23,5]
[6,8,2,2]

И записать их в отдельный массив. Проблема:как найти совпадения, что бы поиск по совпадения не давал дубликаты.В данном случае у первого массива нахожу совпадение с 3 и 6 , потом у 3 нахожу с 1 и 6, и так делее , если допустим внутренних массивов больше , или других(не с (2) как в примере) совпадений больше

Answer 1

Для группировки массива удобно использовать метод reduce. Для того, чтобы не бежать по массиву дважды, можно сохранять текущий индекс группы с максимальным количеством элементов и саму эту группу.

Код может выглядеть так:

var src = [ 
  [2, 3, 4, 5], 
  [3, 2, 4, 5], 
  [2, 3, 8, 5], 
  [6, 1, 23, 5], 
  [2, 1, 23, 5] 
]; 
 
var dest = src.reduce((acc, cur) => { 
  let key = cur[0]; 
  if (!acc.map[key]) { 
    acc.map[key] = []; 
  } 
  acc.map[key].push(cur); 
  if (isNaN(acc.maxKey) || 
    acc.maxKey != key && 
    acc.map[acc.maxKey].length < acc.map[key].length) { 
    acc.maxKey = key; 
    acc.result = acc.map[key]; 
  } 
  return acc; 
}, { 
  map: {}, 
  maxKey: NaN, 
  result: null 
}); 
 
console.log(dest.result);

Для обновленного вопроса, нужно добавлять в результирующий массив те элементы, которые уже повторяются. Код может выглядеть так:

var src = [ 
  [2, 3, 4, 5], 
  [3, 2, 4, 5], 
  [2, 3, 8, 5], 
  [6, 1, 23, 5], 
  [2, 1, 23, 5], 
  [6, 8, 2, 2] 
] 
 
var dest = src.reduce((acc, cur) => { 
  let key = cur[0]; 
  if (!acc.map[key]) { 
    acc.map[key] = []; 
  } 
  if (acc.mapCount[key]) { // если ключ уже повторялся 
    acc.result.push(cur); // добавляем сразу в результат 
    return acc; 
  } 
  acc.map[key].push(cur); 
  if (acc.map[key].length == 2) { // если ключ повторяется 
    acc.mapCount[key] = true; // выставляем флаг 
    acc.result.push(...acc.map[key]); // переносим в результат 
  } 
  return acc; 
}, { 
  map: {}, 
  mapCount: {}, 
  result: [] 
}); 
 
console.log(dest.result);

READ ALSO
Как вывести дату без точек, с пробелами?

Как вывести дату без точек, с пробелами?

Нужно вывести дату в формате среда, 19 4 2017 именно с пробелами

191
Сохранение переменных в html и их экспорт в JS

Сохранение переменных в html и их экспорт в JS

Имеются переменные в html полученные при помощи socketio

216
Ошибка - js invalid or unexpected token

Ошибка - js invalid or unexpected token

Подскажите что не так:

278
Открыть div по клику на другой div

Открыть div по клику на другой div

Всем доброго времени сутокЕсть такая разметка

210