Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    5

    esecizio sugli array javascript

    Devo svolgere questo esercizio in javascript senza poter usare cicli ma solo funzioni di ordine superiore.

    Scrivere una funzione where(array,modello) che riceve un array di oggetti e un oggetto modello. La funzione deve ritornare gli oggetti dell'array che contengono tutti gli attributi contenuti in modello con gli stessi valori. Ad esempio:
    where(persone, {età: 55} ritorna: [{nome: "Luigi" età:55}]
    Nel caso ad esempio in cui l'array passato è [{nome:"Antonio" età:42} ,{nome:"Luigi" età:55}]

    Grazie.

  2. #2
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    cosa hai provato a fare finora?
    l'array può contenere anche sottooggetti annidati?
    la query può contenere anche più di un parametro da controllare? e in questo caso dovrebbe funzionare in "and" (ovvero filtri se tutti i parametri coincidono) oppure in 'or' (basta un solo parametro valido)?
    Ultima modifica di fcaldera; 10-11-2016 a 11:40
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  3. #3
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    Potresti implementare una funzione del genere

    codice:
    function where(array, query, andLogic = 1) {
    
       if (!(andLogic in [0, 1])) {
          andLogic = 1;
       }
         
       return array.filter(function(o) {
          var res = andLogic;
          Object.keys(query).forEach(function(par) {
             var resPar = o[par] === query[par];
             res = (!!andLogic)? (res && resPar) : (res || resPar);
          });
         
          return res;
       });
    };
    La funzione filtra gli elementi dell'array se la funzione di callback ritorna true
    e questo è possibile solo se ciascuno (o almeno uno) dei parametri della query corrisponde al valore dell'array. Il 'ciascuno' (and) o 'almeno uno' (or) è un comportamento che puoi controllare con un terzo parametro opzionale che di default è impostato a 'and'


    Per fare i test ho usato il seguente oggetto (senza annidamenti)

    codice:
    var o =  [
      { nome : "Alessandro",
        eta  : 42,
        sesso : "M"
      },
      { nome : "Bruno",
        eta  : 55,
        sesso : "M"
      },
      { nome : "Cristina",
        eta  : 50,
        sesso : "F"
      },
      { nome : "Diana",
        eta  : 48,
        sesso : "F"
      },
      { nome : "Enrico",
        eta  : 50,
        sesso : "M"
      }
    ];

    E questi sono i test che ho eseguito


    codice:
    /* =========== TEST =========== */
    
    
    console.info("> Inizio Test <")
    
    
    console.log(where(o, { eta: 55 }));
    // Ritorna un array con un solo oggetto
    
    
    console.log(where(o, { nome: "Alessandro" }));
    // Ritorna un array con un solo oggetto
    
    
    console.log(where(o, { sesso: "M" }));
    // Ritorna un array con 3 oggetti
    
    
    console.log(where(o, { eta: 52 }));
    // Ritorna un array vuoto
    
    
    console.log(where(o, { eta: 50, sesso: "F" }));
    // Ritorna un array con un solo oggetto (logica AND per default)
    
    
    console.log(where(o, { eta: 10, sesso: "M" }, 'foobar'));
    // Ritorna un array vuoto (logica AND per default, 'foobar' non valido)
    
    
    console.log(where(o, { eta: 50, sesso: "X" }, 0));
    // Ritorna un array con 2 oggetti (logica OR)
    
    
    console.log(where(o, { chiaveinesistente: '0' }));
    // Ritorna un array vuoto se la chiave non esiste
    
    
    console.log(where(o, { chiaveinesistente: '0', nome: 'Bruno' }, 0));
    // Ritorna un array con un solo elemento  (logica OR)
    
    
    console.log(where(o, { nome: 'valoreinesistente' }));
    // Ritorna un array vuoto se il valore non esiste

    Esempio funzionante (testato su Chrome)
    http://codepen.io/anon/pen/xRwoez?editors=0010
    Ultima modifica di fcaldera; 10-11-2016 a 12:48
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  4. #4
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,133
    @ggt90 ma non avevi risolto questo esercizio.
    @fabrizio spero che prendi un bel voto iniziare l'anno male non sarebbe il caso
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  5. #5
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    Quote Originariamente inviata da cavicchiandrea Visualizza il messaggio
    @fabrizio spero che prendi un bel voto iniziare l'anno male non sarebbe il caso
    Grazie, ma i 36 esami universitari a suo tempo mi sono già bastati
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    5
    Quote Originariamente inviata da cavicchiandrea Visualizza il messaggio
    @ggt90 ma non avevi risolto questo esercizio.
    @fabrizio spero che prendi un bel voto iniziare l'anno male non sarebbe il caso
    No, ne avevo risolto un altro simile...questo qua proprio non so come affrontarlo.

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    5
    Quote Originariamente inviata da fcaldera Visualizza il messaggio
    Potresti implementare una funzione del genere

    codice:
    function where(array, query, andLogic = 1) {
    
       if (!(andLogic in [0, 1])) {
          andLogic = 1;
       }
         
       return array.filter(function(o) {
          var res = andLogic;
          Object.keys(query).forEach(function(par) {
             var resPar = o[par] === query[par];
             res = (!!andLogic)? (res && resPar) : (res || resPar);
          });
         
          return res;
       });
    };
    La funzione filtra gli elementi dell'array se la funzione di callback ritorna true
    e questo è possibile solo se ciascuno (o almeno uno) dei parametri della query corrisponde al valore dell'array. Il 'ciascuno' (and) o 'almeno uno' (or) è un comportamento che puoi controllare con un terzo parametro opzionale che di default è impostato a 'and'


    Per fare i test ho usato il seguente oggetto (senza annidamenti)

    codice:
    var o =  [
      { nome : "Alessandro",
        eta  : 42,
        sesso : "M"
      },
      { nome : "Bruno",
        eta  : 55,
        sesso : "M"
      },
      { nome : "Cristina",
        eta  : 50,
        sesso : "F"
      },
      { nome : "Diana",
        eta  : 48,
        sesso : "F"
      },
      { nome : "Enrico",
        eta  : 50,
        sesso : "M"
      }
    ];

    E questi sono i test che ho eseguito


    codice:
    /* =========== TEST =========== */
    
    
    console.info("> Inizio Test <")
    
    
    console.log(where(o, { eta: 55 }));
    // Ritorna un array con un solo oggetto
    
    
    console.log(where(o, { nome: "Alessandro" }));
    // Ritorna un array con un solo oggetto
    
    
    console.log(where(o, { sesso: "M" }));
    // Ritorna un array con 3 oggetti
    
    
    console.log(where(o, { eta: 52 }));
    // Ritorna un array vuoto
    
    
    console.log(where(o, { eta: 50, sesso: "F" }));
    // Ritorna un array con un solo oggetto (logica AND per default)
    
    
    console.log(where(o, { eta: 10, sesso: "M" }, 'foobar'));
    // Ritorna un array vuoto (logica AND per default, 'foobar' non valido)
    
    
    console.log(where(o, { eta: 50, sesso: "X" }, 0));
    // Ritorna un array con 2 oggetti (logica OR)
    
    
    console.log(where(o, { chiaveinesistente: '0' }));
    // Ritorna un array vuoto se la chiave non esiste
    
    
    console.log(where(o, { chiaveinesistente: '0', nome: 'Bruno' }, 0));
    // Ritorna un array con un solo elemento  (logica OR)
    
    
    console.log(where(o, { nome: 'valoreinesistente' }));
    // Ritorna un array vuoto se il valore non esiste

    Esempio funzionante (testato su Chrome)
    http://codepen.io/anon/pen/xRwoez?editors=0010
    Grazie mille per la risposta molto esauriente, il problema è che non posso aggiungere il terzo parametro...mi impone di creare una funzione con solo quei due parametri (array,modello)...per questo ho trovato difficoltà.

  8. #8
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    Quote Originariamente inviata da ggt90 Visualizza il messaggio
    Grazie mille per la risposta molto esauriente, il problema è che non posso aggiungere il terzo parametro...mi impone di creare una funzione con solo quei due parametri (array,modello)...per questo ho trovato difficoltà.
    cambiala pure togliendo quello che non ti serve.
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.