web-dev-qa-db-fra.com

Pour souligner js, puis-je obtenir plusieurs colonnes avec la méthode pluck après entrée, où méthode comme linq select projection

var people = [
    {firstName : "Thein", city : "ny", qty : 5},
    {firstName : "Michael", city : "ny", qty : 3},
    {firstName : "Bloom", city : "nj", qty : 10}
];

var results=_.pluck(_.where(people, {city : "ny"}), 'firstName');

Par exemple: j'ai besoin de firstName et qty.

40
ttacompu

Pour projeter sur plusieurs propriétés, vous avez besoin de map , pas de plumer:

var results = _.map(
    _.where(people, {city : "ny"}), 
    function(person) {
        return { firstName: person.firstName, qty: person.qty };
    }
);

[{"firstName": "Thein", "qty": 5}, {"firstName": "Michael", "qty": 3}] 

(Violon)

Notez que si vous le souhaitez, vous pouvez créer une méthode d'assistance "pluckMany" qui fait la même chose que plumer avec des arguments variables:

// first argument is the source array, followed by one or more property names
var pluckMany = function() {
    // get the property names to pluck
    var source = arguments[0];
    var propertiesToPluck = _.rest(arguments, 1);
    return _.map(source, function(item) {
        var obj = {};
        _.each(propertiesToPluck, function(property) {
            obj[property] = item[property]; 
        });
        return obj;
    });
};

Vous pouvez utiliser la fonction _.mixin pour ajouter une fonction "pluckMany" à l'espace de noms _. En utilisant cela, vous pouvez écrire simplement:

var results = _.chain(people).where({city : "ny"}).pluckMany( "firstName", "qty").value();

(Violon)

62
McGarnagle

D'après ce que je comprends, l'auteur de la question veut prendre un tableau d'objets avec de nombreuses propriétés et réduire chaque objet à une petite liste de propriétés.

Il existe une myriade de façons de le faire avec _, mais je préfère cette méthode. Transmettez un objet résultat vide qui sera "ceci" dans la fonction. Itérez avec _each et sélectionnez les champs que vous voulez:

var myObjects = [
    { "first" : "eric",
      "last" : "gumbo",
      "code" : "x482"
    },
    { "first" : "john",
      "last" : "dinkman",
      "code" : "y9283"
    }
];

var result = [];
_.each( myObjects, function(itm) { this.Push(_.pick(itm,"first","code")) }, result );

console.log(result);
4
eeejay

Oui, j'aimerais que pluck ait l'option de passer un tableau, mais entre-temps, vous pourriez faire:

const pluckFields = (arr, fields) => _.map(arr, item => _.pick(item, fields))
4
tldr

Ce linéaire pourrait sauver quelques lignes: 

var results=_.pick(_.where(people, {city : "ny"}), 'firstName', 'qty');
0
Nadeem

YAAUu - Yep Une autre réponse Utilisation du trait de soulignement ...

// use a proper browser to run this code snippet, a browser that is es6-compliant
let people = [{
    firstName: "Thein",
    city: "ny",
    qty: 5
  },
  {
    firstName: "Michael",
    city: "ny",
    qty: 3
  },
  {
    firstName: "Bloom",
    city: "nj",
    qty: 10
  }
];
// either you pick the properties you want 
let picking = _.iteratee((person) => _(person).pick("firstName", "city"));
// either you omit the properties you do not want
let omitting = _.iteratee((person) => _(person).omit("qty"));
// create the filter by city
let living = (people, city) => _(people).where({
  "city": city
});
// put the "filter by city" into a mixin (as I assume it would be used again & again)
_.mixin({
  living: living
});
// do the thing (twice), 
// these chaining methods could be done into a mixin as well
console.log("results by picking properties:", _(people).chain().living("ny").map(picking).value());
console.log("results by omitting properties:", _(people).chain().living("ny").map(omitting).value());
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

0
zobidafly