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 !
0 votes
Votre exemple n'a aucun sens, car vous n'utilisez pas réellement l'option
attr
vous obtenez simplement le paramètreattr
des objets. Vous voulez probablement le changer en :array.sort(function(a, b, attr) { return a[attr] - b[attr]; }, 'name');