Maison > Questions et réponses > le corps du texte
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;
}
}
};
这是红宝书中一个知识点,这段代码不是太明白
过去多啦不再A梦2017-07-05 11:08:44
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 :
let arr = [{ name: 'foo', value: 123 }, { name: 'bar', value: 456 }]
À ce stade, la méthode générale sort
doit être écrite ainsi, sous la forme :
arr.sort(function (a, b) { return a.value - b.value > 0 ? 1 : -1 })
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 à :
// 创造一个【根据 value 字段来排序】的函数
let compareFn = createComparisonFunction('value')
// 将创造的函数传入 sort 中作为排序依据
arr.sort(compareFn)
Cela joue un rôle dans la simplification de la logique métier.
淡淡烟草味2017-07-05 11:08:44
Ce que je ne comprends pas, c'est que comparer la taille d'un certain attribut de deux objetscreateComparisonFunction("test")({'test': 1}, {"test": 2})
renvoie -1
巴扎黑2017-07-05 11:08:44
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
.