regex extractGroup中的正则表达式组提取逻辑不正确

0yycz8jy  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(75)

我有6个细胞从'id'列的datatables文本的细胞是这些

Supercar 1x01
Supercar 1x02
Supercar 2x01
Supercar 2x02
Supercar 3x01
Supercar 3x02

我尝试将行分组,从“id”列中获取3个单元格

Supercar 1x01
Supercar 2x01
Supercar 3x01

但我只得到一个分组的行和文本单元格,

Supercar 1x01

我不希望只有一个分组行
我试着用这种方式来实现,这是相关代码:

function extractGroup(text) {
    var match = text.match(/[^\d\s]+/);
    return match ? match[0] : '';
}

function initializeDataTable(data) {
    if (dataTable) {
        dataTable.destroy();
    }
    var tableData = [];
    if (grouped) {
        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();
                tableData.push({
                    "checkbox": '<input type="checkbox" class="grouped-checkbox">',
                    "id": '<span class="badge ' + badgeClass + '">' + badgeText + '</span> ' + groupItems[0].id,
                    "username": groupItems.map(function(item) {
                        return item.username;
                    }).join('<br>'),
                    "extra": '<button class="downloadBtn">Scarica</button>',
                    "showLinks": groupItems.length > 2
                });
            }
        }

        dataTable = $('#userTable').DataTable({
            "data": tableData,
            "columns": [
                {"data": "checkbox"},
                {"data": "id"},
                {"data": "username"},
                {"data": "extra"}
            ],
            "lengthMenu": [5, 10, 25, 100, 500],
        });

        // Dopo aver inizializzato la DataTable, chiamare showAllRowsInCell per le celle 'Username'
        if (grouped && groupedData) {
            $('.grouped-mode tbody tr td:nth-child(3)').each(function() {
                var cell = this;
                var rowIndex = dataTable.row($(this).closest('tr')).index();
                var groupName = dataTable.row(rowIndex).data().id.match(/[^\d\s]+/)[0];
                var groupItems = groupedData[groupName];
                if (groupItems) {
                    showAllRowsInCell(cell, groupItems.map(function(item) { return item.username; }).join('<br>'), groupName);
                    // Aggiungi i punti di log qui per verificare i valori
                    console.log("cell:", cell);
                    console.log("content:", groupItems.map(function(item) { return item.username; }).join('<br>'));
                    console.log("groupName:", groupName);
                }
            });
        }

    } else {
        dataTable = $('#userTable').DataTable({
            "data": data,
            "columns": [
                {
                    "data": null,
                    "render": function (data, type, row) {
                        return '<input type="checkbox" name="selectedUsers[]" value="' + data.id + '" class="individual-checkbox">';
                    },
                    "orderable": false // Rende la colonna non ordinabile
                },
                {
                    "data": null,
                    "render": function (data, type, row) {

                        var badgeClass = 'badge-' + (data.badge || '').toLowerCase();
                        return '<span class="badge ' + badgeClass + '">' + (data.badge || '') + '</span> ' + data.id;
                    }
                },
                {"data": "username"},
                {
                    "data": null,
                    "render": function (data, type, row) {
                        return '<button class="downloadBtn">Scarica</button>';

                    },
                    "orderable": false // Rende la colonna non ordinabile
                }
            ],
            "lengthMenu": [5, 10, 25, 100, 500],
        });

THIS是JavaScript的完整代码,可以看到其他错误
问题是当前的JavaScript代码无法根据文本中既不是空格也不是数字的第一个字符正确地对行进行分组。这会导致行的分组不正确。
详细地说,initializeDataTable函数试图根据特定的逻辑对数据进行分组,但似乎所使用的方法并没有产生预期的结果。特别是,extractGroup函数用于提取组,但它可能无法按预期工作。

zengzsys

zengzsys1#

你的正则表达式只匹配字符串的第一部分:Supercar,因为它看起来不是一个空间和一个数字。
为了分组行,您应该匹配包含数字公共部分的字符串:1x2x3x
您可以尝试以下操作:

function extractGroup(text) {
    var match = text.match(/^([a-zA-Z]+\s\d+x)/);
    return match ? match[0] : '';
}

希望这对你有帮助。

相关问题