skip to Main Content

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:

enter image description here

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


  1. Chosen as BEST ANSWER

    I solve in this way: I create 2 functions for each radio button / badge

    function extractGroup(text) {
        var containsNxM = /d+xd+/.test(text);
        if (containsNxM) {
            var match = text.match(/^([a-zA-Zs]+sd+x)/);
            return match ? match[0] : '';
        } else {
            return text;
        }
    }
    

    and this

    function groupNewspapers(text) {
      var containsHash = /#sd+sw+sd+/g.test(text);
      if (containsHash) {
        var match = text.match(/^([a-zA-Zs]+)s#sd+s(w+sd+)/gm);
        return match.map(function(line) {
          return line.replace(/^([a-zA-Zs]+)s#sd+s(w+sd+)/, '$1 # $2').replace(/^d+sw+s/, '');
        }).join('n');
      } else {
        return text;
      }
    }
    

    and for table initialization I rewrite in this way

    function initializeDataTable(data) {
        if (dataTable) {
            dataTable.destroy();
        }
        var tableData = [];
        if (grouped) {
            groupedData = {};
            data.forEach(function(item) {
                var groupName;
                if (item.badge === 'serietv') {
                    groupName = extractGroup(item.id);
                } else if (item.badge === 'quotidiani') {
                    groupName = groupNewspapers(item.id);
                }
    
                if (!groupedData[groupName]) {
                    groupedData[groupName] = [];
                }
                groupedData[groupName].push(item);
            });
    

  2. 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.

    function groupByDate(data) {
      var groupedData = {};
      data.forEach(function(item) {
        var date = item.id.replace(/^(.*?)d{1,2}s((?:gennaio|febbraio|marzo|aprile|maggio|giugno|luglio|agosto|settembre|ottobre|novembre|dicembre)sd{4})/i, '$1[$2]');
        if (date != item.id) {
          key = date[0].toLowerCase();
        } else {
          key = 'other';
        }
        if (!groupedData[key]) {
          groupedData[key] = [];
        }
        groupedData[key].push(item);
      });
      return groupedData;
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search