77 votes

Est-il possible d'étendre la méthode array.sort() de javascript pour accepter un autre paramètre ?

J'essaie de trier un tableau d'objets. Je préférerais ne pas écrire une méthode de tri personnalisée pour chaque attribut.

Y a-t-il un moyen d'étendre le système intégré array.sort() pour accepter un paramètre supplémentaire, décrivant l'attribut à trier ? Par exemple,

array.sort(function(a, b, attr) { return a.attr - b.attr; }, 'name');

0 votes

Votre exemple n'a aucun sens, car vous n'utilisez pas réellement l'option attr vous obtenez simplement le paramètre attr des objets. Vous voulez probablement le changer en : array.sort(function(a, b, attr) { return a[attr] - b[attr]; }, 'name');

-1voto

Cody Points 1198

L'étendre réellement

Afin d'étendre réellement Array.prototype.sort nous avons plusieurs options :

  • Muter son signature
  • Trier en multiplicité en utilisant Décorateurs | Adaptateurs ( Modèle de parent : Wrapper )

J'étais dans le même bateau que vous et j'ai décidé d'utiliser la deuxième approche :

private sortAddresses = (a, b) => {
    let iPrimeFlag = this.sortAddressesByPrimaryFlag(a, b);
    let iAlphaNum = this.sortAddressesByAlphaNum(a, b);

    if (iPrimeFlag === 1) return 1;
    else return iAlphaNum;
};

private sortAddressesByPrimaryFlag(a, b) {
    if (b.primaryFlag > a.primaryFlag) return 1;
    if (b.primaryFlag < a.primaryFlag) return -1;
    return 0;
}

private sortAddressesByAlphaNum(a, b) {
    let aAddress = this.$.formatAddress(a);
    let bAddress = this.$.formatAddress(b);

    if (aAddress > bAddress) return 1;
    if (aAddress < bAddress) return -1;

    return 0;
}

Intention

Je suis déjà en train d'appeler this.addresses.sort(this.sortAddresses) en plusieurs endroits et j'aimerais garder mon ChangeCost faible surtout en sachant que nous pourrions avoir des exigences à trier sur encore plus d'heuristiques .

Donc, afin de suivre Les deux "règles d'or" du Gang des Quatre --

Programme vers une interface, pas une implémentation.

y

Encapsuler ce qui varie.

-- J'ai décidé de garder mon signature la même et envelopper ma méthode originale.

Il serait utile de ne pas avoir à modifier chaque ligne où l'on invoque la fonction this.addresses.sort . Au lieu de cela, nous aimerions être en mesure d'ajouter un indéfini nombre d'"heuristiques" de tri à l'action de trier.

L'objectif est de donner la priorité aux objets d'adresse dont les primaryFlag es 'Y' et ensuite prendre la chaîne d'adresse -- '0000 Some St, #0000, City, ST 00000' -- et les trier par ordre alphanumérique. Depuis 'Y' es > 'N' nous aimerions le déplacer en haut dans la liste, visuellement, en abaissant son indice. En triant la chaîne d'adresses par ordre alphanumérique, on peut dire que si 'Colorado' es > 'Alabama' alors nous devrions heurter 'Colorado' en bas dans la liste visuellement en augmentant son indice.

Utilisation

Ceci est utilisé pour le triage Adresses par des valeurs différentes. Une valeur, primaryFlag est pour indiquer si c'est la [seule] adresse par défaut ; dans mon cas, primaryFlag est une piqûre de 'Y' o 'N' et non un booléen (demandez à mes coéquipiers de Back-End pourquoi dans le monde ?). L'autre valeur, this.$.formatAddress(a|b) prend ces adresses [object Object] 's -- a y b -- et invoque formatAddress de mon Bac à sable this.$ .

La ligne if (iPrimeFlag === 1) return 1; dit "si primaryFlag est égal à 1, il suffit de le déplacer vers la tête (le début) du tableau, sinon, faites ce que l'heuristique alphanumérique décide", ce qui nous permet de donner la priorité à par une heuristique tout en se rabattant sur une autre.

A noter également, .bind(undefined, 'prop') es no utilisé dans mon code actuel car je n'en ai pas besoin ; c'est juste ici à des fins démonstratives. .

Maintenant, je sais que je suis cette personne qui a fourni quelques TypeScript -- faites-moi savoir si vous ne comprenez pas ce qui se passe dans ce code :)

A la vôtre !

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