Сортировать буквенно-цифровые по массиву из более чем одного столбца - PullRequest
0 голосов
/ 15 ноября 2018

Эта функция прекрасно работает, когда выполняется на одном массиве:

var stringArray = ['48AB1','48AB10','48AB101','48AB106','48AB108','48AB11','48AB111','48AB1117','48AB1138','48AB18','48AB2'];
var regex = /^([a-z]*)(\d*)/i;
function sortFn(a, b) {
  var _a = a.match(regex);
  var _b = b.match(regex);

  // if the alphabetic part of a is less than that of b => -1
  if (_a[1] < _b[1]) return -1;
  // if the alphabetic part of a is greater than that of b => 1
  if (_a[1] > _b[1]) return 1;

  // if the alphabetic parts are equal, check the number parts
  var _n = parseInt(_a[2]) - parseInt(_b[2]);
  if(_n == 0) // if the number parts are equal start a recursive test on the rest
      return sortFn(a.substr(_a[0].length), b.substr(_b[0].length));
  // else, just sort using the numbers parts
  return _n;
}


console.log(stringArray.sort(sortFn))

У меня есть массив из нескольких столбцов, но я хочу отсортировать массив только по 1-му столбцу. Как я могу изменить этот код, чтобы вставить только один столбец в функцию сортировки? Я извлекаю данные из службы SQL и использую их для заполнения таблицы JQuery. Данные сортируются по умолчанию в естественном порядке (то есть 48AB1,48AB10,48AB100 и т. Д.)

Я новичок в программировании, поэтому любая помощь будет признательна. Спасибо!

редактирование: Вот больше информации о том, как я все это создаю

var attrs = []
const activate = () => {

    WyoArch.serverApi("QuerySites").then(sites => {
            // jqxGrid creation
            // --> reusable options to stylize grid
            let mixinGridOptions = mixin => new Object({},
                columns: mixin.columns,
                source: createJqxDataAdapter(mixin.source || [])
            })

        attrs = sites; 
        console.log(attrs)
        // --> sites
        pickers.site.jqxGrid = $("#curateExisting-sitePicker .picker-jqxGrid").jqxGrid(mixinGridOptions({
            source: sites,
            columns: [{
                    text: 'ID',
                    datafield: 'SiteID',
                    width: 100
                },
                {
                    text: 'Name',
                    datafield: 'SiteName',
                    width: 150
                },
                {
                    text: 'Landowner',
                    datafield: 'LandOwner',
                    width: 100
                },
                {
                    text: 'TWN',
                    datafield: 'TWN',
                    width: 80
                },
                {
                    text: 'RNG',
                    datafield: 'RNG',
                    width: 80
                },
                {
                    text: 'Section',
                    datafield: 'Section',
                    width: 80
                },
            ],
        }))
    }
}

Снимок экрана консольного журнала массива

1 Ответ

0 голосов
/ 15 ноября 2018

Примечание : более ранние версии этого были отброшены после комментариев здесь и в вопросе разъяснили требования.


После проработки вопроса и обновлений к нему, этоПохоже, это будет делать то, что запрашивается.Данные вырезаны из изображения - пожалуйста, оставляйте текст, а не изображения!- и может не совсем соответствовать тому, что происходит.При этом используется то, что для меня является функцией с тем же поведением, что и в оригинале, но несколько упрощенной.

Но главное - обернуть ваш sortFn так, чтобы он работал с элементами со свойством sort вSiteID поле, вы можете просто написать новый компаратор, как это:

(a, b) => sortFn(a.SiteID, b.SiteID)

... и передать его в table.sort().

const regex = /^([a-z]*)(\d*)/i;

const sortFn = (a, b) => {
  if (a == '' && b == '') {return 0;}
  const [a0, a1, a2] = a.match(regex);
  const [b0, b1, b2] = b.match(regex);
  return a1 < b1 ? -1 : a1 > b1 ? 1 : a2 - b2 || sortFn(a.substr(a0.length), b.substr(b0.length)) 
}

const sortBySiteId = (a, b) => sortFn(a.SiteID, b.SiteID)

var table = [
  {SiteID: '1ABCTest', SiteName: 'App Testing RK', ContactID: 250},
  {SiteID: '1ABCTest', SiteName: 'App Testing',    ContactID: 250},
  {SiteID: '1Albany',  SiteName: 'RK Test',        ContactID: 56},
  {SiteID: '1BCDTest', SiteName: 'RK Test 2',      ContactID: 201},
  {SiteID: '1OFF',     SiteName: 'One OFF',        ContactID: 161},
  {SiteID: '24BH406',  SiteName: 'KOBOLD RANCH',   ContactID: 250},
  {SiteID: '42IN124',  SiteName: null,             ContactID: null},
  {SiteID: '42IN40',   SiteName: null,             ContactID: null},
  {SiteID: '42SV5',    SiteName: null,             ContactID: null},
  {SiteID: '42UN95',   SiteName: null,             ContactID: null},
  {SiteID: '48AB1',    SiteName: 'CHINA WALL',     ContactID: null},
  {SiteID: '48AB10',   SiteName: 'EL PRIMERO',     ContactID: null},
];

console.log(table.sort(sortBySiteId))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...