I have these text rows for these lines
Il Messaggero Roma 22 settembre 2023
Il Messaggero Roma 21 settembre 2023
Il Messaggero 22 settembre 2023
Il Messaggero 21 settembre 2023
Il Messaggero Roma 21 agosto 2023
Il Messaggero Roma 20 agosto 2023
Le Grandi Glorie del Rock – 15 febbraio 2023
Corriere della Sera Sette 26 agosto 2023
and I’m trying to group them like this and with these names
Il Messaggero Roma [settembre 2023]
Il Messaggero Roma [agosto 2023]
Il Messaggero [settembre 2023]
Le Grandi Glorie del Rock - [febbraio 2023]
Corriere della Sera Sette [agosto 2023]
Instead the rows are incorrectly grouped with incorrect inclusions and names
settembre [settembre]
agosto [agosto]
febbraio [febbraio]
"Corriere della Sera Sette 25 Agosto 2023
" and also "Il Messaggero
" are erroneously included in
settembre [settembre]
agosto [agosto]
but they must be considered as distinct elements. This picture show the wrong grouping:
I made my attempt with this code
Function to group texts such as Il messaggero 21 settembre 2023
or Le Grandi Glorie del Rock – 15 febbraio 2023
function groupByDate(data) {
var groupedData = {};
data.forEach(function(item) {
var date = item.id.match(/d{1,2}s(?:gennaio|febbraio|marzo|aprile|maggio|giugno|luglio|agosto|settembre|ottobre|novembre|dicembre)sd{4}/i);
if (date) {
date = date[0].toLowerCase();
if (!groupedDataSeptember 23, 2023) {
groupedDataSeptember 23, 2023 = [];
}
groupedDataSeptember 23, 2023.push(item);
} else {
if (!groupedData['other']) {
groupedData['other'] = [];
}
groupedData['other'].push(item);
}
});
return groupedData;
}
Regex to make the match
function extractGroup(text) {
var containsNxM = /d+xd+/.test(text);
var containsDate = /d{1,2}s(?:gennaio|febbraio|marzo|aprile|maggio|giugno|luglio|agosto|settembre|ottobre|novembre|dicembre)sd{4}/i.test(text);
if (containsNxM) {
var match = text.match(/^([a-zA-Zs]+sd+x)/);
return match ? match[0] : '';
} else if (containsDate) {
var match = text.match(/d{1,2}s([a-zA-Z]+)sd{4}/i);
return match ? match[1] : '';
} else {
return text;
}
}
Table initialization
function initializeDataTable(data) {
if (dataTable) {
dataTable.destroy();
}
var tableData = [];
if (grouped) {
var groupedData = {};
data.forEach(function(item) {
var groupName = extractGroup(item.id);
if (!groupedData[groupName]) {
groupedData[groupName] = [];
}
groupedData[groupName].push(item);
});
// Inserisci un log per verificare groupedData
console.log("groupedData:", groupedData);
for (var groupName in groupedData) {
if (groupedData.hasOwnProperty(groupName)) {
var groupItems = groupedData[groupName];
var badgeText = groupItems[0].badge;
var badgeClass = 'badge-' + (badgeText || '').toLowerCase();
var commonText = groupName.split('[')[0].trim(); // Estrai la parte comune dal nome
tableData.push({
"checkbox": '<input type="checkbox" class="grouped-checkbox">',
"id": '<span class="badge ' + badgeClass + '">' + badgeText + '</span> ' + commonText + ' [' + groupName + ']', // Cambio qui
"username": groupItems.map(function(item) {
return item.username;
}).join('<br>'),
"extra": '<button class="downloadBtn">Scarica</button>',
"showLinks": groupItems.length > 2
});
}
}
Complete code of table initialization is HERE but I think that is useless for this purpose
2
Answers
I solve in this way: I create 2 functions for each radio button / badge
and this
and for table initialization I rewrite in this way
Your grouping key needs to keep the part of the text before the date, and remove the day number. Use a regexp replacement for this.