TL; DR Verwendung:
var results = _.chain(people)
.where({ city: "ny" })
.map(_.partialRight(_.pick, 'firstName', 'qty'))
.value();
Aber lesen Sie bitte weiter nach Erklärungen, wie ich den Prozess des Findens dieser Lösung fühlen interessanter als die tatsächliche Antwort.
Das allgemeine Muster wäre (es funktioniert mit lodash
auch):
_.map(array, function(obj) { return _.pick(obj, 'x', 'y', 'z'); });
diese allgemeine map
Funktion gegeben, die jedes Element einer Sammlung verwandelt, gibt es mehrere Möglichkeiten anzupassen, dies zu Ihre besondere Situation (das bürgt für die Flexibilität von map
, die ein sehr grundlegender Baustein funktionaler Programme ist).
Lassen Sie mich unter mehreren Möglichkeiten vorhanden unsere Lösung zu implementieren:
var _ = require('lodash'); // @lodash 2.4.1 at the time of writing
// use underscore if you want to, but please see http://stackoverflow.com/questions/13789618/differences-between-lodash-and-underscore
/* la data */
var people = [{
firstName: "Thein",
city: "ny",
qty: 5
}, {
firstName: "Michael",
city: "ny",
qty: 3
}, {
firstName: "Bloom",
city: "nj",
qty: 10
}];
/* OPTION1 : mixin' with _ */
_.mixin({
pluckMany: function() {
var array = arguments[0],
propertiesToPluck = _.rest(arguments, 1);
return _.map(array, function(item) {
/* Alternative implementation 1.1
* ------------------------------
* Taken from @mMcGarnagle answer
* _each is easy to understand here,
* but has to modify the variable `obj` from a closure
* I try to avoid that for trivial cases like this one.
*/
var obj = {};
_.each(propertiesToPluck, function(property) {
obj[property] = item[property];
});
return obj;
/* Alternative implementation 1.2
* ------------------------------
* Rewrite the previous code,
* by passing the accumulator (previously`obj`, but really it is an object that accumulates the result being constructed) across function calls.
* This construction is typical of the `reduce` function, closer to a functionnal programming style.
*/
return _.reduce(propertiesToPluck, function(obj, property) {
obj[property] = item[property];
return obj;
}, {});
/* Alternative implementation 1.3
* ------------------------------
* If we are already using lodash/underscore,
* then let's use the `pick` function ! I also included an example of `flatten` here
*/
return _.pick(item, _.flatten(propertiesToPluck, true));
/* Alternative implementation 1.4
* ------------------------------
* But really flatten is not needed.
*/
return _.partial(_.pick, item).apply(null, propertiesToPluck);
});
}
});
/* Let's use our mixed function !
* Since we call several _ functions on the same object
* it is more readable to chain the calls.
*/
var results = _.chain(people)
.where({
city: "ny"
})
.pluckMany('firstName', 'qty')
.value();
/* OPTION 2 : without mixing our code with lodash/underscore */
var results = _.chain(people)
.where({
city: "ny"
})
.map(_.partialRight(_.pick, 'firstName', 'qty'))
.value();
console.log(results);
Wenn Sie mit underscore
oder lodash
schreiben Codes wie diese Weise sehr ich vorschlagen, dass Sie einen Blick auf funktionale Programmierung, haben als Diese Art des Schreibens sowie viele Funktionen (map
, reduce
unter vielen anderen) kommen von dort.
Hinweis: Dies ist offenbar eine häufig gestellte Frage in Strich: https://github.com/jashkenas/underscore/issues/1104
Dies ist offenbar kein Zufall, wenn diese aus sind links von Unterstrichen/lodash: „composability ist besser als Merkmale“. Sie könnten auch do one thing and do it well
sagen. Dies ist auch der Grund, warum _.mixin
existiert.
Dank McGarnagle; Um Parameter an pluckMany zu übergeben, ist es gut Array zu übergeben? Ich bin ein Neuling und denke darüber nach, Unterstreichung zu übernehmen. Ich denke Mixin ist äquivalent zu jquery plugin (fn). – ttacompu
@ttacompu Wie ich es geschrieben habe, musst du 1) Array und 2) mehrere Argumente übergeben. Sie könnten es ändern, um entweder mehrere Argumente oder ein Array als zweiten Parameter zu akzeptieren ... – McGarnagle