Come utilizzare Underscore.js filtro con un oggetto?

Ho un oggetto in questo modo:

> Object
  > [email protected].com: Array[100]
  > [email protected].com: Array[4]
    > 0
       id : 132
       selected : true
    > 1
       id : 51
       selected : false

ecc..

Come posso utilizzare il carattere di sottolineatura _.filter() per tornare indietro solo gli elementi selezionati === vero?

Non ho mai avuto il bisogno di andare giù a strati con _.filter(). Qualcosa di simile

var stuff = _.filter(me.collections, function(item) {
    return item[0].selected === true;
});

Grazie

  • Potresti chiarire il formato dell’oggetto? Sembra un hash di matrici a chiave per e-mail?
  • questo è corretto, come posso chiarire?
  • E si sta cercando di tirare fuori gli elementi dall’hash in cui tutti gli elementi della matrice sono selected == true?
  • corretto, solo gli elementi selezionati === true
  • Ok, ancora non del tutto sicuro di quello che stai cercando, ma inviato strategie per i due più probabili casi :^)

 

4 Replies
  1. 9

    Se si desidera estrarre tutti gli elementi dell’array da qualsiasi indirizzo di posta elettronica dove selected è true, è possibile procedere in questo modo:

    var selected = [];
    
    for (email in emailLists) {
        selected.concat(_.filter(emailLists[email], function (item) {
            return item.selected === true;
        }));
    }

    Se si desidera solo per tirare le matrici, dove tutti elementi sono selected, si potrebbe invece fare qualcosa di simile a questo:

    var stuff = _.filter(me.collections, function(item) {
        return _.all(item, function (jtem) { 
            jtem.selected === true;
        });
    });
    • Grazie per la prima risposta, che cosa è “e-mail in obj” e “obj[email]” l’oggetto che ho è chiamato “emailLists”, dato che, si può aggiornare? thx
    • strano, sto diventando un “Uncaught SyntaxError: Un identificatore “
    • Certo. obj dovrebbe essere stato emailLists; email è solo la chiave di ogni elemento in oggetto. Dov’è l’errore in arrivo? (Io non l’ho provato!) :^)
    • ok bello che risolto l’errore. selezionato è sempre di tornare come ‘[]’
    • Ho fatto una console.accedere all’interno, e “console.log(elemento.selected === true)” è correttamente registrati come vero o falso. Per qualche motivo non è selezionata var
    • Questo ha funzionato “selected = selezionato.concat” è che ok?
    • Sì! Ho dimenticato che concat restituisce una copia…ops…
    • impressionante. grazie per l’aiuto
    • “per..non dovrebbe essere utilizzato per scorrere un Array dove l’indice l’ordine è importante.”
    • questo diventa il mio oggetto in un array.
    • se avete bisogno di un oggetto, si potrebbe convertire l’oggetto in una matrice di ["key", "value"] coppie, applicare il filtro e zip i risultati con _.oggetto.

  2. 5

    Sottolineatura del filtro del metodo su un oggetto per essere usato come un hash o un dizionario, ma restituisce un array di oggetti enumerabile valori e togliere le chiavi. Ho bisogno di una funzione per filtrare un hash dai suoi valori che vorresti conservare le chiavi, e scrisse in Coffeescript:

    hash_filter: (hash, test_function) ->
      keys = Object.keys hash
    
      filtered = {}
      for key in keys
        filtered[key] = hash[key] if test_function hash[key]
      filtered

    Se non si utilizza Coffeescript, ecco compilato risultato in Javascript, ripulito un po’:

    hash_filter = function(hash, test_function) {
      var filtered, key, keys, i;
      keys = Object.keys(hash);
      filtered = {};
      for (i = 0; i < keys.length; i++) {
        key = keys[i];
        if (test_function(hash[key])) {
          filtered[key] = hash[key];
        }
      }
      return filtered;
    }
    
    
    hash = {a: 1, b: 2, c: 3};
    console.log((hash_filter(hash, function(item){return item > 1;})));
    //Object {b=2, c=3}

    TL; DR: Oggetto.keys() è grande!

    • Ho aggiunto la chiave in un secondo parametro, come Sottolineatura del _.filter() fa. Spero che figata! 🙂
    • _.filter per oggetto con tasti è solo _.pick
  3. 1

    Ho un oggetto chiamato allFilterValues contenente le seguenti:

    {"originDivision":"GFC","originSubdivision":"","destinationDivision":"","destinationSubdivision":""}

    Questo è brutto, ma hai chiesto una sottolineatura base di filtrare un oggetto. Questo è come ho restituito solo il filtro elementi che non aveva falsy valori; è possibile passare l’istruzione return del filtro per qualunque cosa avete bisogno:

        var nonEmptyFilters = _.pick.apply({}, [allFilterValues].concat(_.filter(_.keys(allFilterValues), function(key) {
            return allFilterValues[key];
        })));

    Uscita (JSON/stringified):

    {"originDivision":"GFC"}

Lascia un commento