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
.
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}]
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();
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);
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))
Ce linéaire pourrait sauver quelques lignes:
var results=_.pick(_.where(people, {city : "ny"}), 'firstName', 'qty');
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>