J'ai un tableau multidimensionnel. Le tableau principal est un tableau de
[publicationID][publication_name][ownderID][owner_name]
Ce que j'essaye de faire est de trier le tableau par owner_name
et ensuite par publication_name
. Je sais que vous avez en JavaScript Array.sort()
, dans lequel vous pouvez mettre une fonction personnalisée, dans mon cas, j'ai:
function mysortfunction(a, b) {
var x = a[3].toLowerCase();
var y = b[3].toLowerCase();
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}
C'est bien pour le tri sur une seule colonne, à savoir nom_propriétaire, mais comment puis-je le modifier pour le trier owner_name
, alors publication_name
?
javascript
algorithm
sorting
saveur404
la source
la source
[[A, 10], [J, 15], [A, 5], [J, 5]] => [[A, 10], [A, 5], [J, 15], [J, 5]]
Je pense que ce que vous recherchez est thenBy.js: https://github.com/Teun/thenBy.js
Il vous permet d'utiliser le standard Array.sort, mais avec
firstBy().thenBy().thenBy()
style.Un exemple peut être vu ici .
la source
thenBy
appel, tous les éléments du tableau sont à nouveau bouclés.Un bon moyen de trier sur de nombreux champs qui sont des chaînes est d'utiliser
toLocaleCompare
et l'opérateur booléen||
.Quelque chose comme:
Si vous souhaitez trier sur plus de champs, vous pouvez simplement les chaîner de l'instruction return avec plus d'opérateurs booléens.
la source
.reduce()
.localCompare()
retourne -1, 0, 1 donc je ne pense pas que votre solution fonctionnera comme le || est bon pour les booléenssortItems = (a, b) => (a.distance - b.distance) || (a.name - b.name);
et cela fonctionne comme un charme pour mes besoins non difficiles.(a.name - b.name)
que si nécessaire. Créer d'abord des variables fait un travail supplémentaire même si ce n'est pas nécessaire.Je suis tombé sur le besoin de faire un tri mixte de tableaux d'objets asc et desc de style SQL par clés.
La solution de kennebec ci-dessus m'a aidé à arriver à ceci:
utilisation de l'échantillon:
donne ce qui suit:
(en utilisant une fonction d'impression à partir d' ici )
voici un exemple jsbin .
edit: nettoyé et publié en tant que mksort.js sur github .
la source
Ceci est pratique pour les types alpha de toutes tailles. Passez-lui les index par lesquels vous souhaitez trier, dans l'ordre, comme arguments.
la source
Je suggère d'utiliser un comparateur intégré et d'enchaîner l'ordre de tri souhaité avec logique ou
||
.Exemple de travail:
la source
Vous pouvez concaténer les 2 variables ensemble dans une clé de tri et l'utiliser pour votre comparaison.
la source
J'ai trouvé multisotr . C'est une bibliothèque simple, puissante et petite pour le tri multiple. J'avais besoin de trier un tableau d'objets avec des critères de tri dynamique:
Cette bibliothèque plus puissante, c'était mon cas. Essayez-le.
la source
Je travaillais avec
ng-grid
et devais effectuer un tri sur plusieurs colonnes sur un tableau d'enregistrements renvoyés par une API, j'ai donc proposé cette fonction de tri multiple dynamique et astucieuse.Tout d'abord,
ng-grid
déclenche un "événement" pour "ngGridSorted" et renvoie cette structure, décrivant le tri:J'ai donc créé une fonction qui générera dynamiquement une fonction de tri basée sur le
sortData
comme indiqué ci-dessus ( ne soyez pas effrayé par la barre de défilement! Il ne fait que 50 lignes environ! De plus, je suis désolé pour la pente. Cela a empêché un horizontal barre de défilement! ):Je trie ensuite les résultats de mon API (
results
) comme ceci:J'espère que quelqu'un d'autre appréciera cette solution autant que moi! Merci!
la source
Essaye ça:
Afficher l'extrait de code
Je suppose que vos données dans un tableau
let t = [ [publicationID, publication_name, ownderID, owner_name ], ... ]
où l'index de owner_name = 3 et publication_name = 1.la source
Méthode d'ajout de chaîne
Vous pouvez trier par plusieurs valeurs simplement en ajoutant les valeurs dans une chaîne et en comparant les chaînes. Il est utile d'ajouter un caractère clé fractionné pour éviter le ruissellement d'une clé à l'autre.
Exemple
la source
la source
J'ai eu un problème similaire lors de l'affichage des blocs de pool de mémoire à partir de la sortie de certaines compositions de fonctions h du DOM virtuel. Fondamentalement, j'ai été confronté au même problème que le tri des données multicritères comme le score des résultats de joueurs du monde entier.
J'ai remarqué que le tri multicritères est:
Et si vous ne vous souciez pas, vous pourriez échouer rapidement dans un enfer de nidification if-else ... comme un enfer de rappels de promesses ...
Et si nous écrivons une fonction «prédicat» pour décider si quelle partie de l'alternative utilise? Le prédicat est simplement:
Maintenant après avoir écrit vos tests de classement (byCountrySize, byAge, byGameType, byScore, byLevel ...) quel que soit votre besoin, vous pouvez pondérer vos tests (1 = asc, -1 = desc, 0 = désactiver), les mettre dans un tableau , et appliquez une fonction de réduction `` décider '' comme ceci:
Et voila! A vous de définir vos propres critères / poids / commandes ... mais vous voyez l'idée. J'espère que cela t'aides !
EDIT: * assurez-vous qu'il y a un ordre de tri total sur chaque colonne * soyez conscient de ne pas avoir de dépendances entre les ordres de colonnes, et pas de dépendances circulaires
sinon, le tri peut être instable!
la source
Ma propre bibliothèque pour travailler avec les itérables ES6 (blinq) permet (entre autres) un tri facile à plusieurs niveaux
la source
Provenant de GitHub
la source
Je viens de publier sur npm une micro-bibliothèque appelée sort-helper ( source sur github ) . L'idée est d'importer l'assistant
by
pour créer la fonction de comparaison pour lasort
méthode de tableau via la syntaxeitems.sort(by(column, ...otherColumns))
, avec plusieurs façons d'exprimer les colonnes à trier:persons.sort(by('lastName', 'firstName'))
,dates.sort(by(x => x.toISOString()))
,[3, 2, 4, 1].sort(by(desc(n => n)))
→[3, 2, 1, 0]
,['B', 'D', 'c', 'a'].sort(by(ignoreCase(x => x))).join('')
→'aBcD'
.Il est similaire à la belle ThenBy mentionné dans cette réponse , mais avec les différences suivantes qui peuvent être plus au goût de certains:
thenBy
API fluente) ,la source