IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Balayer devant sa porte.


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 17
    Points
    17
    Par défaut Balayer devant sa porte.
    Bonjour !

    Je voudrais écrire une fonction qui balaie une liste, et qui applique
    une seconde fonction à chaque élément de la liste.

    J'ai écris la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Array.prototype.argubalayer=function(fonction)
    {
    var butee=this.length,liste=[]
    for(var i=0; i<butee; i++) liste.push(fonction(this[i]))
    return liste
    }
    Elle fonctionne très bien; par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    liste_=[1,2,3,4]
    liste_.argubalayer(alert) //produit ce que l'on attend.
    Maintenant, je voudrais écrire la fonction thisbalayer, qui injecterait
    this dans la fonction, comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste.push(this[i].fonction())
    Je ne trouve pas la bonne syntaxe : un tuyau ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    tu peux t'en sortir avec apply :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var liste=[1,2,3]
    Array.prototype.argubalayer=function(func)
    {
     var butee=this.length,liste=[]
     for(var i=0; i<butee; i++){
     //le premier arg représente la référence this au sein de func, le second un tableau de paramètres
      func.apply(this[i], ['lol'+this[i]]);
     }
     return this;
    }
    liste.argubalayer(console.log);
    //affiche
    lol1
    lol2
    lol3

  3. #3
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    @galerien69 : apply n'apporte rien de plus dans ce contexte...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var liste=[1,2,3]
    Array.prototype.argubalayer=function(func)
    {
     var butee=this.length,liste=[]
     for(var i=0; i<butee; i++){
      func('lol'+this[i]);
     }
     return this;
    }
    liste.argubalayer(console.log);
    produit exactement le même résultat...

    @sacapuss2 :
    Elle fonctionne très bien; par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    liste_=[1,2,3,4]
    liste_.argubalayer(alert) //produit ce que l'on attend.
    en es-tu vraiment sûr ?
    Parce que là, tu ne rempli ton tableau liste qu'avec des undefined puisque le push porte sur le résultat de l’exécution de la fonction...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste.push(this[i].fonction())
    là aussi, je ne suis pas certain que tu comprennes bien ce que tu essayes de faire
    Avec cette syntaxe, tu essayes juste de remplir un tableau avec les résultats de l'exécution de la méthode "fonction" de l'objet "this[i]", sachant qu'il s'agit de nombres, ils n'ont pas de méthode alert...

    Ceci dit, je ne comprends pas du tout ce que tu veux réellement obtenir au final.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 17
    Points
    17
    Par défaut Merci.
    Merci, galerien69, de ta prompte réponse !

    Je n'ai encore jamais utilisé cette syntaxe : le moment est peut-être venu de m'y mettre.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 17
    Points
    17
    Par défaut Merci, Bovino !
    Merci, Bovino, de contribuer !

    "en es-tu vraiment sûr ?"
    Merci de ta remarque. Dans le cas présent, je ne m'intéressait pas au return, mais aux alert !

    "sachant qu'il s'agit de nombres, ils n'ont pas de méthode alert"
    Effectivement, dans le deuxieme cas, alert est un mauvais exemple ;o)

  6. #6
    Invité
    Invité(e)
    Par défaut
    apply n'apporte rien de plus dans ce contexte...
    vivi.

    Après la question, c'était d'avoir this au sein de la fonction qui réfère à un élément de la liste. D'où ma proposition.

  7. #7
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    de memoire, dans ce contexte this est en lecture seule ... donc pas modifiable ...

  8. #8
    Invité
    Invité(e)
    Par défaut
    Est-il question de le modifier?

    Sinon, on peut retourner la valeur de func
    qqch du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    this[i] = func.apply(this[i], ['lol']);
    ...
    function func(prefixLol){
     return prefixLol + this;
    }

  9. #9
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Citation Envoyé par sacapuss2 Voir le message
    Maintenant, je voudrais écrire la fonction thisbalayer, qui injecterait
    this dans la fonction, comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste.push(this[i].fonction())
    Je ne trouve pas la bonne syntaxe : un tuyau ?
    Si j'ai bien compris ce que tu veux faire, il n'y a pas de bonne syntaxe, et c'est inhérent à JavaScript : liste.push est une fonction comme les autres, et gère ses arguments de la même façon que les autres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list.push( expression )
    Quelle que soit l'expression que tu écris, elle n'a pas d'influence sur le comportement de push. (Je sais pas si je suis très clair.)

    Sinon, ta méthode argubalayer me fait furieusement penser à la célèbre map, je pense que ça va t'intéresser : https://developer.mozilla.org/en/Jav...ects/Array/map. C'est un principe commun à beaucoup de langages (en fait, on peut imaginer un map dans tout langage qui comporte des listes ou des tableaux)…


  10. #10
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    oui ou array walk en php ...
    il me semble avoir proposé un script js de array map ...
    mais je ne le retrouve plus sur le forum

  11. #11
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Citation Envoyé par Watilin Voir le message
    Sinon, ta méthode argubalayer me fait furieusement penser à la célèbre map, je pense que ça va t'intéresser : https://developer.mozilla.org/en/Jav...ects/Array/map. C'est un principe commun à beaucoup de langages (en fait, on peut imaginer un map dans tout langage qui comporte des listes ou des tableaux)…
    Je ne connaissais pas map (merci du lien ) mais on pouvait aussi penser à Enumerable.each de Prototype qui me semble très proche...
    En tout cas avec map on peut se passer de Prototype pour avoir le même effet. ^^

  12. #12
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    $.each en jquery ...

  13. #13
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Yep ^^ Mais each est une forme plus générale que map : on peut lui demander d'avoir un effet sur les éléments du tableau parcouru, sans attendre de résultat.
    On a une méthode .map() en jQuery, et également Enumerable.map (alias collect) chez Prototype.

  14. #14
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1

  15. #15
    Expert confirmé
    Avatar de RomainVALERI
    Homme Profil pro
    POOête
    Inscrit en
    Avril 2008
    Messages
    2 652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : POOête

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Points : 4 164
    Points
    4 164
    Par défaut
    Date : 08/07/2009
    toujours en avance !

  16. #16
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    en même temps en 27 519 messages, j'ai couvert pas mal de sujets ...

  17. #17
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127

  18. #18
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 17
    Points
    17
    Par défaut Merci de vos contributions.
    Chers collègues,

    merci de vos contributions.

    J'ai l'impression que la fonction map correspond à mon attente. Merci, donc, plus particulièrement, à Watilin, de nous l'avoir révélée.

    J'ai essayé de lire attentivement le document https://developer.mozilla.org/en/Jav...ects/Array/map. Je ne comprends comment on utilise le second argument. L'un de vous saurait-il m'éclairer ?

    Pour les petits curieux, mon chantier est http://www.valeriefondela.doobee.fr/

    Bien à vous.

    sacapuss2

  19. #19
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    Le second paramètre correspond à l'objet référencé comme this dans la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var a = [1,2,3], b = ['a','b','c'];
    b.map(function(valeur, index){
        var resultat = index + ' : ' + valeur + '\nthis : ' + this[index];
        alert(resultat);
    }, a);

  20. #20
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2011
    Messages : 19
    Points : 17
    Points
    17
    Par défaut Array.prototype.formvaluer=function(booleen)
    Salut les copains !

    Je ne prends pas le temps de réfléchir à la réponse de Bovino (merci, Bovino !), mais vous livre la fonction que j'ai arrêtée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Array.prototype.formvaluer=function(booleen)
    {
    var form=this,butee=form.length
     
    for(var i=0; i<butee; i++)
    {
    element=form[i]
     
    if(booleen)
    {
    if(element.tagName.isin('INPUT','TEXTAREA')) element.name.cooker(element.value=element.value.trimer())
    else element.getAttribute('name').cooker(element.getAttribute('value'))
    }
     
    else // vidage
    {
    if(element.tagName.isin('INPUT','TEXTAREA')) element.name.cooker(element.value=vide)
     
    else // selecteur
    {
    element.setAttribute('value',vide)
    element.getAttribute('name').cooker(vide)
    } 
    } 
    } 
    }
    Si vous avez envie de faire des commentaires...

    Merci, d'avance !

Discussions similaires

  1. Réponses: 9
    Dernier message: 12/06/2015, 15h40
  2. se garer devant une porte de garage
    Par Bathou dans le forum La taverne du Club : Humour et divers
    Réponses: 63
    Dernier message: 27/10/2008, 12h07
  3. Port parallele
    Par Phoneus dans le forum C
    Réponses: 2
    Dernier message: 05/05/2002, 23h19
  4. [Kylix] Kylix port //
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 01/04/2002, 12h30
  5. [Kylix] Kylix / port serie
    Par Anonymous dans le forum EDI
    Réponses: 3
    Dernier message: 01/04/2002, 12h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo