function createComparisonFunction(propertyName) {
return function(object1,object2) {
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if(value1 < value2) {
return -1;
} else if(value1 > value2) {
return 1;
} else {
return 0;
}
}
};
这是红宝书中一个知识点,这段代码不是太明白
Il s'agit d'une fonction d'outil conçue pour comparer des structures de données spécifiques. Par exemple, le format de la structure des données est :
À ce stade, la méthode générale
sort
doit être écrite ainsi, sous la forme :Problèmes avec ce code :
Le paramètre
value
est codé en dur et doit être recodé lors du tri des autres champs.La logique du retour 1/-1 est redondante et ennuyeuse.
Écrire directement des fonctions anonymes pour trier n'était pas assez lisible à l'époque du Petit Livre Rouge (maintenant qu'il existe des fonctions fléchées, ce n'est effectivement plus un gros problème).
Donc, pour le cas ci-dessus, l'auteur de Red Book a conçu une fonction d'outil générale pour générer une fonction [pour trier des champs spécifiques]. Notez que lorsque vous appelez cette fonction utilitaire, ce qui est renvoyé est une nouvelle fonction, et non le résultat trié (ce qu'on appelle la fonction d'ordre supérieur).
Après avoir appliqué ce package, le code ressemble à :
Cela joue un rôle dans la simplification de la logique métier.
Ce que je ne comprends pas, c'est que comparer la taille d'un certain attribut de deux objets
createComparisonFunction("test")({'test': 1}, {"test": 2})
renvoie -1
Lorsque vous appelez une fonction, examinez-la en deux étapes. Tout d’abord, renvoyez le résultat de la comparaison via l’attribut
createComparisonFunction()
传入比较的字段。在createComparisonFunction()
函数内,返回一个匿名函数。同时由于匿名函数处在createComparisonFunction()
内,所以你对createComparisonFunction()
传入的参数propertyName
对匿名函数也有效存在。通过上一步,你已经得到的匿名函数包含
propertyName
,此时你就可以传入你要比较的两个对象,在函数内比较他们的propertyName
.C'est ce qu'on appelle une fonction d'ordre supérieur.