2 votes

Tri des tableaux imbriqués

J'utilise javascript pour trier des tableaux imbriqués. Cela fonctionne comme je l'espère :

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"]]

Mais lorsque je fais cela dans le navigateur avec plus de données, rien n'est trié après avoir effectué la commande sort fonction. Il reste exactement comme il était avant d'appeler sort . Une idée de ce qui ne va pas ici ? L'exemple ci-dessus correspond exactement aux données qui sont triées dans l'exemple ci-dessous, chaque tableau imbriqué est simplement plus long avec plus de données qui y sont poussées.

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];
});

3voto

Pointy Points 172438

La fonction de rappel pour .sort() devrait retourner un numéro et non un booléen. Le nombre doit être inférieur à zéro pour indiquer que les deux valeurs sont déjà dans le bon ordre, ou supérieur à zéro pour indiquer qu'elles sont dans l'ordre inverse, ou nul pour indiquer qu'elles sont équivalentes.

Ainsi, ce que vous voulez est quelque chose comme

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

La chaîne .localeCompare() fait exactement ce que vous voulez pour un comparateur de tri. Cependant, vous pouvez voir d'anciennes fonctions de comparateurs basées sur des chaînes de caractères qui font quelque chose comme ceci :

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

qui est plus explicite.

modifier - maintenant que j'ai réexaminé le code original de la question, il se peut que vous vouliez trier en inverser l'ordre de cette clé. Si c'est le cas, vous pouvez simplement annuler l'appel à la fonction .localeCompare() ou comparer b a a au lieu de a a b .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X