Сортировка вложенных массивов - PullRequest
0 голосов
/ 03 июля 2018

Я использую JavaScript для сортировки вложенных массивов. Это работает так, как я ожидаю:

arr = [[223, "VA", "BP8"], [24, "VA", "BP31"], [127, "VA", "BP1"]]

arr.sort(function(a,b){
    return a[2] > b[2];
});

//[[127, "VA", "BP1"], [24, "VA", "BP31"], [223, "VA", "BP8"]]

Но когда я делаю это в браузере с большим количеством данных, после выполнения функции sort ничего не сортируется. Осталось точно так, как было до звонка sort. Есть идеи, что здесь не так? В приведенном выше примере точные данные сортируются в следующем примере: каждый вложенный массив имеет большую длину, и в него помещается больше данных.

tableData = [];
arrayUtil.forEach(event.features, function (feature) {
    var rowData = [];
    rowData.push(feature.attributes.OBJECTID);
    rowData.push(feature.attributes.StateID);
    rowData.push(feature.attributes.Point);
    rowData.push(feature.attributes.PatchNum);
    rowData.push(developed(feature.attributes.IsDeveloped));
    rowData.push(cropType(feature.attributes.CropTypeID));
    rowData.push(feature.attributes.CropResidue);
    rowData.push(feature.attributes.CnpyOver12);
    rowData.push(feature.attributes.CnpyDecid);
    rowData.push(feature.attributes.CnpyConif);
    rowData.push(feature.attributes.ShrubCover);
    rowData.push(feature.attributes.ShbHiStemsDens);
    rowData.push(feature.attributes.GrassCover);
    rowData.push(feature.attributes.ForbCover);
    rowData.push(feature.attributes.FrbAsProtect);
    rowData.push(feature.attributes.ForbSpecies);
    rowData.push(feature.attributes.BareGround);
    rowData.push(herbHght(feature.attributes.HerbHeight));
    var overstoryDesc = coarseClassify(feature.attributes.Overstory);
    rowData.push(overstoryDesc);
    rowData.push(fineClassify(feature.attributes.Understory, overstoryDesc));
    rowData.push(qhStatus(feature.attributes.OfficialQH));
    rowData.push(formatDate(feature.attributes.ObsvDate));
    rowData.push(collectionType(feature.attributes.ObsvType));
    tableData.push(rowData);
});

//Sort the tableData list of lists by Point name
tableData.sort(function (a, b) {
    return a[2] > b[2];
});

1 Ответ

0 голосов
/ 03 июля 2018

Функция обратного вызова на .sort() должна возвращать число , а не логическое значение. Число должно быть меньше нуля, чтобы указать, что два значения уже находятся в правильном порядке, или больше нуля, чтобы указать, что они находятся в обратном порядке, или ноль, чтобы указать, что они эквивалентны.

Таким образом, вы хотите что-то вроде

tableData.sort(function(a, b) {
  return a[2].localeCompare(b[2]);
});

Функция string .localeCompare() делает именно то, что вам нужно для компаратора сортировки. Однако вы можете увидеть более старые функции сравнения на основе строк, которые делают что-то вроде этого:

tableData.sort(function(a, b) {
  if (a < b) return -1;
  if (a > b) return 1;
  return 0;
});

что является более явным.

edit - теперь, когда я повторно проверяю исходный код в вопросе, возможно, вы захотите отсортировать в обратный порядок этого ключа. Если это так, вы можете просто отменить вызов на .localeCompare() или сравнить b с a вместо a с b.

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