Сортировать столбец в dataTable - PullRequest
0 голосов
/ 27 апреля 2020

Как мне отсортировать столбец по первому значению, не учитывая, что в скобках?
Я добавил тип sort, но он не сортируется так, как мне нужно.
Я добавил пример своего кода на jsfiddle: http://jsfiddle.net/alexserden/8geodt1b/27/
Проблема с 9 столбцом.

$("#myTable").DataTable({
    scrollY: '400px',
    width: 100,
    // responsive: true,
    searching: false,
    lengthChange: false,
    // bAutoWidth: true,
    // retrieve: true,
    paging: false,
    scrollX: false,
    data: data,
    columns: [
        {"data": "ourShort"},
        {"data": "espGroup"},
        {"data": "rd"},
        {"data": "city"},
        {"data": "hr"},
        {"data": "shr"},
        {"data": "vacancy"},
        {"data": null,  render: data => {

                if(data.deltaHired<=0){
                    return '<span>'+data.hired + '</span>' +' (▾'+data.deltaHired+')'
                }else{
                    return '<span>'+data.hired + '</span>' + ' (▴'+data.deltaHired+')'
                }
        }},
        {"data": null,className:"textAlignRight", type: 'sort', render: data => {
                if(data.deltaFired>=0){
                    return '<span>'+data.fired+'</span>'+' (▴'+data.deltaFired+')'
                }else{
                    return '<span>'+data.fired+'</span>' +' (▾'+data.deltaFired+')'
                }

            }},
        {"data": null, className:"textAlignRight", type: 'sort', render: data => {
                if(data.deltaStaffing<0){
                    return '<span>'+data.staffing + '%'+'</span>' +' (▾'+data.deltaStaffing*(-1)+'%)'
                }else{
                    return  '<span>'+data.staffing + '%'+'</span>' +' (▴'+data.deltaStaffing+'%)'
                }

        }}

    });
});

1 Ответ

1 голос
/ 27 апреля 2020

Просто чтобы прояснить проблему (на случай, если я неправильно понял). Глядя на столбец 9 в качестве примера. Если вы сейчас сортируете эти данные, вы увидите следующее:

enter image description here

Значения отсортированы не так, как ожидалось.

Что вы хотите см. вот это:

enter image description here

Для этого я внес следующие изменения:

1) В конце я добавил 3 новых столбца вашего "columns" раздела:

{ "data": "hired", "visible": false },
{ "data": "fired", "visible": false },
{ "data": "staffing", "visible": false }

Это столбцы 11, 12, 13 - но их индексы 10, 11, 12.

2) Я добавил новый "orderData" элемент к трем столбцам, которые содержат дополнительные данные, которые вы хотите игнорировать:

{"data": null,  "orderData": [ 10 ], render: ... // the "hired" data
{"data": null,  "orderData": [ 11 ], render: ... // the "fired" data
{"data": null,  "orderData": [ 12 ], render: ... // the "staffing" data

Это означает, что «нанятый» столбец будет использовать данные в индексе столбца 10 в качестве данных сортировки. Но столбец индекса 10 скрыт, поэтому пользователи его не видят. И этот подход повторяется для дополнительных 2 столбцов.

Заключительное примечание:

Я внес небольшие изменения в ваш JSON, чтобы сделать его действительным JSON:

Например:

'city': "NewYork", // invalid

"city": "NewYork", // valid

Вот что я в итоге использовал:

let data = [{
    "city": "NewYork",
    "deltaFired": 0,
    "deltaHired": 0,
    "deltaStaffing": "2",
    "espGroup": 1,
    "fired": 9,
    "hired": 0,
    "hr": "Петренко",
    "ourShort": "Магазин 3",
    "rd": "Пузатенко",
    "shr": "65.0",
    "staffing": "68",
    "vacancy": "29.5"
}, {
    "city": "LosSantos",
    "deltaFired": 0,
    "deltaHired": 0.5,
    "deltaStaffing": "1",
    "espGroup": 1,
    "fired": 2,
    "hired": 9.4,
    "hr": "Сидоренко",
    "ourShort": "Магазин 4",
    "rd": "Петренко",
    "shr": "125.0",
    "staffing": "69",
    "vacancy": "45.3"
}, {
    "city": "Kiev",
    "deltaFired": 0,
    "deltaHired": 0,
    "deltaStaffing": "1",
    "espGroup": 1,
    "fired": 6,
    "hired": 9.7,
    "hr": "Выасильченко",
    "ourShort": "Магазин 1",
    "rd": "Иваненко",
    "shr": "109.0",
    "staffing": "29.39",
    "vacancy": "49.0"
}, {
    "city": "Kiev",
    "deltaFired": 0,
    "deltaHired": 0,
    "deltaStaffing": "1",
    "espGroup": 1,
    "fired": 6.2,
    "hired": 9,
    "hr": "Выасильченко",
    "ourShort": "Магазин 1",
    "rd": "Иваненко",
    "shr": "109.0",
    "staffing": "2.6",
    "vacancy": "49.0"
}, {
    "city": "Kiev",
    "deltaFired": 0,
    "deltaHired": 0,
    "deltaStaffing": "1",
    "espGroup": 1,
    "fired": 5.9,
    "hired": 5.5,
    "hr": "Выасильченко",
    "ourShort": "Магазин 1",
    "rd": "Иваненко",
    "shr": "109.0",
    "staffing": "39",
    "vacancy": "49.0"
}, {
    "city": "Kiev",
    "deltaFired": 0,
    "deltaHired": 0,
    "deltaStaffing": "1",
    "espGroup": 1,
    "fired": 6,
    "hired": 9.5,
    "hr": "Выасильченко",
    "ourShort": "Магазин 1",
    "rd": "Иваненко",
    "shr": "109.0",
    "staffing": "29.94",
    "vacancy": "49.0"
}, {
    "city": "Kiev",
    "deltaFired": 0,
    "deltaHired": 0,
    "deltaStaffing": "1",
    "espGroup": 1,
    "fired": 6,
    "hired": 9,
    "hr": "Выасильченко",
    "ourShort": "Магазин 1",
    "rd": "Иваненко",
    "shr": "109.0",
    "staffing": "29.987",
    "vacancy": "49.0"
}];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...