Visualizzazione dei risultati da 1 a 8 su 8

Hybrid View

  1. #1
    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)

  2. #2
    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à.

  3. #3
    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 © 2026 vBulletin Solutions, Inc. All rights reserved.