J'ai une fonction de flèche, offerte gracieusement par Ele de la communauté ici, mais pour la vie de moi, je ne peut pas le comprendre:
function isValid (arr, arr2) {
...this is where i'm lost
}
Quelqu'un aurait-il la gentillesse de traduire cela en une fonction standard afin que je puisse suivre mon niveau de compétence?
Merci .
Mon hypothèse:
let isValid = function (arr, arr2) {
let sum = (array, n) => array.reduce((a, an) => a + (an === n), 0);
return !arr2.some(n => !arr.some(an => an === n && sum(arr, an) === sum(arr2, n)))
};
3 Réponses :
Cette approche utilise de nombreuses fonctions fléchées et peut être traduite en déclarations de fonction standard suivantes:
let isValid = function(arr, arr2) {
let sum = function (array, n) {
return array.reduce(function(a, an) {
return a + (an === n); // coercion -> true = 1, false = 0
}, 0);
};
return !arr2.some(function(n) {
let sum2 = sum(arr2, n);
return !arr.some(function(an) {
return an === n && sum(arr, an) === sum2;
});
});
};
donc ma question de suivi est, si arr et arr 2 sont des tableaux fournis par l'utilisateur, alors d'où viennent n, a, an? à quoi correspondent-ils?
@Sweepster n de arr2 , a est l'accumulateur de la fonction reduction et an code > est le nom actuel de la boucle de la fonction réduire .
@Sweepster J'ai traduit les fonctions fléchées avec un léger changement de performance.
Vous pouvez utiliser https://babeljs.io/ pour compiler de ce nouveau javscript vers un "ancien" javascript . Vous pouvez l'essayer directement sur sa page d'accueil.
Voici le résultat qu'il donne:
var isValid = function isValid(arr, arr2) {
var sum = function sum(array, n) {
return array.reduce(function (a, an) {
return a + (an === n);
}, 0);
};
return !arr2.some(function (n) {
return !arr.some(function (an) {
return an === n && sum(arr, an) === sum(arr2, n);
});
});
};
PS: vous devez supprimer le mot-clé function de let isValid = function (arr, arr2) pour compiler correctement.
Votre hypothèse est correcte pour la fonction externe. La première ligne à l'intérieur deviendrait:
let foo = single_arg => alert(1); let foo2 = (arg1, arg2) => alert(2);
Découvrez les fonctions fléchées et en quoi elles diffèrent des déclarations de fonctions conventionnelles. Pour la plupart (mais pas complètement), ce ne sont que des fonctions syntaxiques par rapport aux fonctions conventionnelles.
Elles diffèrent le plus nettement en termes de contexte, c'est-à-dire ce que ceci indique à l'intérieur du corps de la fonction . Les fonctions fléchées s'exécutent toujours dans le contexte externe prédominant dans lequel la fonction a été déclarée. Fonctions conventionnelles, par ex. via bind () , peut être rejoint dans un contexte différent.
let sum = (array, n) => array.reduce((a, an) => a + (an === n), 0);
Alors que diriez-vous de ce sucre? Cela peut sembler déroutant au début, surtout lorsque vous avez plusieurs fonctions fléchées sur une seule ligne. Une chose clé à retenir est qu'il s'agit simplement de raccourcis implicites pour les choses que vous deviez coder manuellement.
let foo3 = a => {
return a+1;
};
Est la même chose que
foo(1); //2
(Le levage sera différent, mais c'est un peu au-delà de la portée de cette réponse.)
Une chose que nous pouvons dire de ce qui précède est que, où la partie après => est une seule déclaration, il est interprété comme une valeur de retour, sans que nous ayons à écrire return .
function foo2(a) { return a + 1; }
C'est parfait pour les fonctions simples qui font un travail exprimable en un ligne de code. Si vous avez besoin de fonctions plus détaillées, insérez le code dans {} comme d'habitude.
let foo = a => a+1;
Cela fonctionne à nouveau de la même manière que le foo code> et foo2 ci-dessus.
Et donc, enfin, décomposer cette ligne effrayante:
let foo = function() {
let bar = () => this;
return bar();
}.bind('a');
foo(); //'a', because foo()'s context is 'a'
Il dit:
sum array et n { et } pour le corps de la fonction. Ce travail consiste à appeler reduction () et à renvoyer (implicitement) la valeur réduire , le rappel, accepte deux arguments, a et an réduire , n’a qu’une tâche à faire, et cette tâche consiste à renvoyer la valeur de a + (an === n) code> Un dernier mot sur le sucre, que vous avez peut-être repéré ci-dessus, est que, avec les fonctions fléchées, si un seul argument est accepté, vous n'avez pas besoin de le mettre entre crochets. Cependant, plusieurs arguments sont séparés par des virgules, comme d'habitude.
function sum(array, n) {
return array.reduce(function(a, an) {
return a + (an === n);
}, 0);
J'espère que cela vous aidera.
Remplacez
(arr, arr2) =>parfunction (arr, arr2). Répétez le même schéma.Attendez, j'en suis le créateur.
En effet, vous l'êtes! Je vous en remercie encore une fois et je suis gêné de dire que votre compétence dépasse de loin la mienne. J'ai juste besoin d'une traduction plus standard pour pouvoir en tirer des leçons et étendre mes capacités afin qu'un jour je puisse être aussi concis que vous dans mon codage.
let sum = (array, n) => array.reduce ...peut être écrit commefunction sum (array, n) {return array.reduce ...}Vous voudrez peut-être en savoir plus sur les fonctions de rappel. La syntaxe des flèches est un raccourci pour ceux-ci, mais présente quelques différences mineures. Les fonctions nommées sont cependant beaucoup plus faciles à lire.
@SpencerWieczorek non, une traduction est ce que je demande. Je sais ce que fait le code, mais pas comment il le fait. La traduction m'aidera à décoder la méthode et à apprendre à coder de manière aussi concise
La première flèche du premier extrait rend la syntaxe invalide