web-dev-qa-db-fra.com

équivalent de _.pick () mais pour tableau dans Lo-dash

J'ai la collection suivante:

var columns = [
    { key:'url', width:20, type:'text' },
    { key:'title', width:21, type:'text' },
    { key:'desc', width:22, type:'text' },
    { key:'domain', width:23, type:'text' },
    { key:'user', width:24, type:'text' }
];

Je cherche une méthode pour mapper un tableau d'objets avec des clés choisies, quelque chose comme:

_.mapPick(columns, [width]) 
// [{width:20},{width:21},{width:22},{width:23},{width:24}]

Je sais que je peux étendre lo-dash comme ceci:

_.mixin({
    mapPick:  mapPick:function (objs,keys){
        return _.map(objs, function (obj) {
            return _.pick(obj,keys)
        })
    }

});

Je ne sais pas s'il y a une fonction native qui me manque.

J'ai trouvé une question similaire ici mais je cherche une manière native plus lo-dash.

31
pery mimon

Je pense que l'approche map () + pick () est votre meilleur pari. Vous pouvez toutefois composer le rappel au lieu de créer une fonction en ligne:

_.map(columns, _.partialRight(_.pick, 'key'));
24
Adam Boduch

Dans mon cas, j'ai également besoin de transtyper pour taper, et le problème était ce que le compilateur TS représente la solution d'Adam Boduch renvoyer un booléen, donc je trouve un moyen simple de le faire:

_.map(columns, item => { return { key: item.key } });

Dans ce cas, vous pouvez également ajouter de nouvelles propriétés.

P.S. Parce que je ne peux pas poster de commentaire, je vais ajouter des explications sur l'utilisation de partialRight ici:

_.map(columns, _.partialRight(_.pick, 'key'));

First si u appelle _.map(array, func) func sera appelé pour chaque élément du tableau. C'est donc égal: _.map(array, item => func(item)).

Second le résultat de l'appel partialRight sera une fonction newFunc , nous pouvons donc représenter le code d'Adam comme:

var newFunc = _.partialRight(_.pick, 'key');
_.map(array, item => newFunc(item));

Troisième nous pouvons représenter la logique newFunc comme:

function newFunc(item) {
    return _.pick(item, 'key')
}

Enfin Je pense que la solution la plus compréhensible et lisible pour ce problème est:

_.map(columns, item => _.pick(item, 'key'))
19
Vlad

J'ai trouvé une solution plus simple dans exemples de cartes :

var users = [
    {name:'David',age:35},
    {name:'Kate',age:28},
];
_.map(users,'age'); // [35,28]
14
David

Si vous ne voulez qu'une des clés, vous pouvez le faire:

_.map(collection, 'key')

Votre exemple:

var columns = [
    { key:'url', width:20, type:'text' },
    { key:'title', width:21, type:'text' },
    { key:'desc', width:22, type:'text' },
    { key:'domain', width:23, type:'text' },
    { key:'user', width:24, type:'text' }
];

var widths = _.map(columns, 'width');

widths
[20, 21, 22, 23, 24]
5
Metalstorm

Avec ES6 déstructuration et fonctions fléchées vous pouvez le faire comme ceci:

columns.map(({width}) => ({width}))

Aucun lodash requis.

4
Dr Hund