Qu'est-il arrivé à Lodash _.pluck?

273

J'ai déjà utilisé Lodash _.pluck... J'ai adoré la cueillette ...

Réalisant que Lodash ne prend plus en charge pluck(à partir de Lodash 4.x), j'ai du mal à me rappeler quoi utiliser à la place ...

Je suis allé aux docs , j'ai frappé cmd-f, tapé 'pluck', mais mon pauvre ami abandonné n'est même pas donné une mention appropriée ... pas même un 'a été remplacé par' ...

Quelqu'un peut-il me rappeler ce que je dois utiliser à la place?

sfletche
la source
lodash.com/docs#pick
Daniel A. White
lodash.com/docs#result
Daniel A. White

Réponses:

411

Ah-ha! Le Lodash Changelog dit tout ...

"Supprimé _.plucken faveur de la _.mapsténographie itérative"

var objects = [{ 'a': 1 }, { 'a': 2 }];

// in 3.10.1
_.pluck(objects, 'a'); // → [1, 2]
_.map(objects, 'a'); // → [1, 2]

// in 4.0.0
_.map(objects, 'a'); // → [1, 2]
sfletche
la source
110
Ne pourraient-ils pas simplement garder les deux ...? Je ne vois pas la nécessité de renommer les choses juste pour les renommer.
Kenny Worden
17
Il ne s'agit pas de "renommer" - la carte existait déjà - et le pluck a simplement été supprimé. Il se trouve que la carte fournit des fonctionnalités similaires avec la même signature d'argument.
Chris
51
Pourquoi diable voudrais-je deux sonnettes sur ma maison? S'ils font tous les deux la même chose, épargnez aux gens la confusion et éliminez-en un. À mon avis, cela vaut le changement de rupture. Débarrassez-vous des déchets supplémentaires, simplifiez l'API et les gens peuvent apprendre à utiliser l'autre sonnette. Ce n'est pas comme si c'était plus difficile à utiliser. Je souhaite que plus de développeurs suppriment la cruauté. +1 à l'équipe de lodash pour avoir introduit le changement révolutionnaire (pas de sarcasme ici, vraiment).
Landon Poch
27
Supprimer pluck juste pour les funzies signifie que personne ne pourra jamais mettre à jour lodash en toute sécurité. Ce n'est pas comme si c'était un langage compilé ... donc ennuyeux ...
Scott Stafford
8
@ScottStafford C'est pourquoi cela s'appelle un changement de rupture . Si vous ne vous embêtez pas à lire le journal des modifications lorsque les versions principales changent, alors ne vous embêtez pas à mettre à jour les versions majeures. Vous pouvez mettre à jour en toute sécurité dans la même version principale.
oligofren
71

Il n'y a pas besoin _.mapou _.pluckdepuis que ES6 a décollé.

Voici une alternative utilisant JavaScript ES6:

clips.map(clip => clip.id)

Michael J. Calkins
la source
3
Pas même besoin d'ES6: Array.prototype.mapest dans la norme ES5.1. Voir le support du navigateur - cela remonte aussi loin que quiconque a besoin de s'inquiéter en 2017, très probablement!
davnicwil
2
@davnicwil Array.prototype.mapest ES5.1, bien sûr, mais la syntaxe de flèche mignonne =>pour les fonctions anonymes ne l'est pas. ;)
00dani
3
@ 00Dani bon point! Mes yeux sautèrent complètement sur la grosse flèche. Ah bien, ce clips.map(function (clip) { return clip.id })n'est toujours pas si mal je suppose ;-)
davnicwil
11
Vous pouvez réellement le raccourcir si vous utilisez ES6clips.map(({id}) => id)
Dr.Pil
1
C'est très vrai, mais il est utile de savoir ce qui s'est passé, _.pluckcar certains projets antérieurs à ES6 pourraient utiliser les méthodes de lodashe. :)
csalmeida
18

Utilisez _.mapau lieu de _.pluck. Dans la dernière version, le _.plucka été supprimé.

Dheeraj Nalawade
la source
2

Si vous voulez vraiment du _.plucksupport, vous pouvez utiliser un mixin:

const _ = require("lodash")

_.mixin({
    pluck: _.map
})

Parce que mapprend désormais en charge une chaîne ("l'itérateur") comme argument au lieu d'une fonction.

Richie Bendall
la source
pluck! = map. Pluck vous permet de passer une chaîne et c'est la même chose que de donnerfunction (record) { return(record[that_string]) }
Brian Underwood
@BrianUnderwood Merci! Je répète: _.mappeut être utilisé comme un égal fonctionnel s'il est utilisé correctement.
Richie Bendall
-2

Ou essayez la méthode nonlodash ES6 pure comme celle-ci

const reducer = (array, object) => {
  array.push(object.a)
  return array
}

var objects = [{ 'a': 1 }, { 'a': 2 }];
objects.reduce(reducer, [])
PayteR
la source
C'est inutilement compliqué, quand vous pouvez le faire objects.map(object => object.a).
jkjustjoshing