Входящие данные : двухмерный массив
[
[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) как в примере) совпадений больше
Для группировки массива удобно использовать метод 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);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно вывести дату в формате среда, 19 4 2017 именно с пробелами
Имеются переменные в html полученные при помощи socketio