10
votes

Triez la matrice extérieure basée sur des valeurs dans la matrice intérieure, JavaScript

J'ai une matrice avec des tableaux de table, où je veux trier les matrices extérieures en fonction de valeurs dans une colonne spécifique de l'intérieur.

Je parie que cela sonnait plus qu'un peu déroutant, alors je vais sauter droit. à un exemple.

Données initiales: xxx

Données de tri, basée sur la colonne avec index 1 xxx

où l'objet ressemblerait à ce que l'objet ressemblerait à ceci; xxx

Données de tri, basée sur la colonne avec index 2 xxx

où l'objet ressemblerait alors à ceci; xxx

le BIG Q

Y a-t-il une solution existante à cela que vous connaissez, ou devrais-je avoir à écrire un moi-même? Si oui, quel serait l'algorithme de tri le plus facile à utiliser? Quicksort?

_L


3 Réponses :


1
votes

utilisé ici une implémentation de tri renvoyée le résultat d'une comparaison simple x . Cette solution est découragée et ce poste n'est laissé que pour préserver la discussion suivante.


14 commentaires

D'oh. Je ne savais pas que vous pourriez simplement retourner x [a]> y [a] pour une valeur de comparaison comme celle-là. Ça va me sauver quelques lignes de code.


@David: Vous retournez true ou false . Vous devez retourner -1, 0 ou 1. (J'ai vérifié, au cas où il y avait une chose vraiment cool, mais ce qui précède, il échoue pour trier correctement dans tous les cas.)


@ T.J.Crowder: lorsque j'exécute ce code, il génère correctement "un - trois - deux", "deux - trois - un", "un - trois - deux". Juste la sortie que vous attendez d'un type alphabétique. N'est-ce pas le résultat que vous voyez? JSBIN.com/ovoze3


@ T.J. AweNder: En outre: Mine - JSBIN.com/ovoze3/edit votre - jsbin.com/ovoze3/2/edit . Appuyez sur "Aperçu"> "Go" en eux, et ils produiront exactement le même résultat


@David: Ce n'est pas le résultat que je vois (et peut-être plus au point, n'est-ce pas le résultat que je devrait voir). Mon test original était sur chrome ("deux trois", "trois un deux", "un deux trois"). Cela ne fonctionne pas non plus sur IE7 ("un trois deux", "deux un trois", "deux un trois"). Il fait semble travailler sur Firefox, que je prends comme un effet secondaire de la manière dont il implémente trier (par exemple, il se passe juste à la fois lorsque la d'autres a fait) plutôt qu'une interprétation fiable du code. Exécuter vos tests JSBIN sur Chrome montre le même RSEULT, avec la mine indiquant le résultat correct.


@David: Voir la section 15.4.4.11 du 5ème éd. Spec ( ECMA-International.org/publications/standards/ecma-262. HTM ): La fonction de comparaison "... devrait être une fonction qui accepte deux arguments x et y et renvoie une valeur négative si x y. " et la section 11.8.5 (environ > ): " La comparaison ... produit vrai, faux ou indéfini (qui indique qu'au moins un opérande est nan). " retourner true ou false sorti de la fonction entraîne donc un comportement non défini et comme la fonction doit avoir trois résultats possibles, un comportement incorrect.


Eh bien, hleh alors. J'avais tapé une solution différencie entre -1/0/1, mais j'ai vu que je suis entré en collision avec @david et pensais que sa solution était plus élégante. Donc, j'ai supprimé la mienne. Je suppose que j'aurais dû quitter la mienne. Et ici je pensais que j'avais manqué de concept javascript bizarre.


@ T.J. Crowder: Curieux, j'ai couru tous mes tests sur Chrome 5 et ouvrit Firefox juste pour vérification. Voyant toujours les mêmes résultats en Chrome, mais je vais écrire cela comme une curiosité de mise en œuvre, puis. merci pour les pointeurs


@David: bizarre! Je suis vraiment choqué d'entendre cela travaillait dans le chrome 5 bêta. Mes tests étaient en chrome 4.1. (Et encore une fois, il ne devrait pas travailler, quel que soit le point plus saillant.)


Cela devrait aller plus loin que je suppose que je suppose, mais je préférerais ne pas le supprimer, car la discussion qui a suivi semble valoir la peine d'économiser ...


@David: Je m'attends à ce que vous le modifiez, cela ne vous sera pas révélé.


La réponse à cela est probablement que le vrai / faux avec la coercition de type correspond à 0/1, c'est-à-dire deux des valeurs attendues. Maintenant, en fonction de l'algorithme de tri utilisé et que le tableau à trier, ces deux résultats (égaux ou x> y) peuvent en réalité donner le résultat correct. Et comme différents navigateurs utilisent différents algorithmes pour le tri, je suppose que c'est ce qui se passe ici ..


J'ai lu ceci et j'étais comme "aucune chance qui fonctionne ..." Et cela fonctionne littéralement ... C'est génial, merci beaucoup, vous m'avez sauvé de mettre en œuvre mon propre tri, à la hausse :).


@Trevor: Vous n'avez pas à mettre en œuvre votre propre tri, mais s'il vous plaît utiliser la réponse acceptée. Lisez les commentaires à cette réponse pour justification :-)



14
votes

Array # Trier (voir la section 15.4.4.11 de La spécification ou MDC ) Accepte un paramètre de fonction optionnel qui sera utilisé pour comparer deux entrées à des fins de tri. La fonction devrait renvoyer -1 si le premier argument est "inférieur à" le second, 0 s'ils sont égaux, ou 1 si le premier est "supérieur à" la seconde. Donc: xxx

(vous pouvez évidemment comprimer ce code un peu; je l'ai gardé verbeux pour plus de clarté.)


0 commentaires

7
votes

Voici une solution qui n'a pas besoin d'une variable distincte pour contenir l'index xxx

cette sorte sur index 2


7 commentaires

Vous devriez changer ce = sur === . Les comparaisons n'aiment pas être confondues pour des missions.


Eh bien, changez-le à == ou === en fonction de vos besoins.


Oui, un petit bug là - fixé maintenant


J'ai tendance à suggérer === à la suite d'un conseil de Douglas Crockford: "Il est presque toujours préférable d'utiliser le === et ! == Opérateurs. Le == et ! = Les opérateurs font la coercition de type. En particulier, n'utilisez pas == pour comparer contre FALSY valeurs." Mais je conviens qu'il y a des instances où la coercition de type peut être souhaitée. (Voir: JavaScript.crockford.com/code.html )


@awgy: Dans ce cas, cependant, il est probablement plus logique d'utiliser == - parce que > et << / code> est de type conversion de type , donc si vous utilisez === dans son code ci-dessus, vous retournerez 1 de manière incorrecte si les valeurs sont == mais pas === .


Mais dans ce cas, toutes les valeurs sont des cordes, il ne compte donc pas vraiment. Et que> et


C'était une excellente solution. Correction de mon problème Programmagiquement!