2015-05-26 3 views
22

Ich habe die folgende Sammlung:Äquivalent _.pick(), aber für Array in Lo-dash

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' } 
]; 

Ich bin für eine Methode sucht ein Array von Objekten mit gepflückt Schlüssel, etwas entlang der zur Karte Linien:

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

ich weiß, ich lo-dash wie folgt verlängern:

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

}); 

ich bin nicht sicher, ob es eine native Funktion ist, dass Ich vermisse.

Ich habe eine ähnliche Frage here gefunden, aber ich bin auf der Suche nach einem mehr Strich-nativen Weg.

+0

* "Ich bin sicher, dass es eine native Funktion ist" * By "nativ" meinst du eine lodash-methode? Wenn man sich die Dokumentation ansieht, scheint es so, als hätte man nichts verpasst. –

+0

rechts, 'lodash method'. Ich kann etwas vermissen, indem ich die richtige Kombination von _method_ und _paramer_ –

Antwort

21

Ich denke, die map() + pick() Ansatz ist Ihre beste Wette. Sie könnten den Rückruf statt der Schaffung einer Inline-Funktion jedoch komponieren:

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

nicht benutze. Sie sollten erklären, was 'partiallyRight' für harte verwendet wird;) – aemonge

3

Wenn Sie nur eine der Tasten möchten, können Sie tun:

_.map(collection, 'key') 

Ihr Beispiel:

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] 
14

In meinem Fall muss ich auch Cast zu schreiben, und das Problem war, was TS Compiler Adam Boduch Lösung einen Boolean Rückgabe darstellt, so finde ich ein wenig einfachen Weg, dies zu tun:

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

In diesem Fall können Sie auch einige neue Eigenschaften hinzufügen.

P.S. Weil ich einen Kommentar kippe ich Erklärung über partialRight Nutzung hinzufügen hier:

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

Erste wenn u _.map(array, func) nennen func wird für jedes Array-Element aufgerufen werden. So ist es gleich: _.map(array, item => func(item)).

Zweite das Ergebnis der Anruf partialRight wird eine Funktion newfunc, so können wir Adams Code darstellen als:

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

Dritte wir die newfunc Logik darstellen als:

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

Schließlich ich denke, die meisten verständlich und gut lesbar Lösung für dieses Problem ist:

_.map(columns, item => _.pick(item, 'key')) 
+2

Vorsicht, die Pfeilfunktion' => 'ist nur in ES6-kompatiblen Browsern verfügbar. Für Safari/IE-Unterstützung können Sie die gute alte anonyme Funktion verwenden: '_.map (Spalten, Funktion (Element) {return _.pick (Element, 'Schlüssel')});' – bjunix

8

ich einfachere Lösung in map examples gefunden:

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

Das ist gute Antwort, aber es Array von Objekten wird nicht zurückgegeben –