2013-08-13 9 views
6

Ich habe meine eigene Version von dem, was ich brauche, neu implementiert, aber ich vermute, dass dies bereits im Unterstrich enthalten ist, da es so einfach und so eng mit vielen anderen Funktionen verbunden ist. Aber ich kann mir nicht vorstellen, wie es heißen soll.Was ist das Objekt entspricht _pluck

Grundsätzlich, was ich will, ist eine Version von _.pluck, die mit Objekten arbeitet und ein Objekt anstelle eines Arrays (mit den zugehörigen Schlüsseln) zurückgibt.

So zum Beispiel, wenn ich ein Objekt wie dieses hatte:

elements: { 
    steam: { 
     temperature: 100, 
     color: 'orange', 
     state: 'gas' 
    }, 
    water: { 
     temperature: 50, 
     color: 'blue', 
     state: 'liquid' 
    }, 
    ice: { 
     temperature: 0, 
     color: 'white', 
     state: 'solid' 
    } 
} 

Ich möchte würde _.something(elements, 'temperature')

rufen und haben es zurückgeben

{ 
    steam: 100, 
    water: 50, 
    ice: 0 
} 

Statt _.pluck(elements, 'temperature') die liefert

[100, 50, 0] 

Wie heißt diese Umwandlung und ist sie bereits im Unterstrich enthalten? Ich habe selbst eine schnelle Version mit jQuery's jeder Schleife geschrieben, da ich mit jQuery besser vertraut bin als Unterstreichung (unten eingeschlossen), aber wenn möglich lieber einen aus der Bibliothek verwenden würde.

$.objPluck = function(obj, key) { 
    var ret = {}; 
    $.each(obj, function(k, value) { 
     ret[k] = value[key]; 
    }); 
    return ret; 
} 
+0

Es gibt die 'Array.map' [Methode] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map), was Sie im Grunde tun , aber mit einem Objekt – Ian

+1

Gibt es eine Möglichkeit, 'Array.map' Keys zu erhalten? –

+1

Ich bin mir nicht sicher, ob ich verstehe, was du meinst. Und ich habe mich nur auf Ihre anfängliche Sorge bezogen: "Aber ich kann mir nicht vorstellen, wie es heißen soll". Mit Arrays würde ich das "Mapping" nennen – Ian

Antwort

8

Es gibt keine Methode, genau dies in Strich 1.4.4 zu tun, aber wenn man in Strich bleiben wollen, können Sie

_.object(_.keys(elements), _.pluck(elements, 'temperature')) 

Demo at jsfiddle mit freundlicher Genehmigung von bfavaretto


tun

Ab Unterstrich 1.8.3 kann dies mitkurz und bündig gemacht werden.

Updated demo

+2

Ich würde den exakt gleichen Code posten. Hier ist ein Beispiel, um es zu demonstrieren: http://jsfiddle.net/PfZwx/ – bfavaretto

+0

@bfavaretto upvoted Ihren Kommentar, wie ich vergessen habe, meine Geige zu enthalten. Ich habe auch die 4 Sekunden gesehen, die dein Beitrag abgelaufen ist! :-P – Mathletics

+0

Es waren tatsächlich 12 Sekunden! :) – bfavaretto

0

können Sie einen JavaScript for-in loop verwenden, um durch die Tasten des Objekts iterieren:

var list = []; 

// Iterate through each object key, and pick wanted the values. 
for(var name in obj) 
{ 
    if (obj.hasOwnProperty(name) && name === "temperature") 
    { 
     list.push(obj[name]); 
    } 
} 

Die oben ist ein vereinfachtes Beispiel, aber man sollte es in eine leicht ändern können, verkapseln generische Funktion. Außerdem müssen Sie JQuery hier nicht wirklich verwenden - die native JavaScript-Implementierung wird schneller.

Die Prüfung obj.hasOwnProperty(name) wird von JSLint empfohlen.

3

auf lodash (ähnlich Unterstrich), können Sie _.mapValues(elements,'temperature') verwenden.
es {steam: 100, water: 50, ice: 0}

lodash ref zurück: _.mapValues

durch die Art und Weise Sie _.mapKeys verwenden können Objekt-Hash in einer Zeile
_.mapKeys(elements,'color') //{orange: Object, blue: Object, white: Object}

6

Worth Zugabe hier eine Lösung zu erstellen, die ES6 Pfeil-Funktionen verwendet, etc:

Object.keys(elements).map(f=>elements[f].temperature) 

Beachten Sie, dass dies auf alten nicht funktioniert Er Javascript-Engines, aber in node.js 0.12 mit --harmony funktioniert es gut, oder mit node.js 4.x und später auch. Ich habe es gerade in Chrome 46 getestet und es funktioniert gut.

Es hat den Vorteil, keine zusätzlichen Bibliotheken wie Unterstrich oder Lodash zu benötigen, sondern funktioniert natürlich nur bei neuen JS-Engines.

+1

in einer No-ES6-Notation: Object.keys (Elemente) .map (Funktion (f) {return Elemente [f]. Temperature}) – egidiocs

+1

Aber wo ist der Spaß daran? ;-) – taxilian

+0

nützlich 4 jemand vielleicht ... – egidiocs

0

In neueren Versionen gibt es tatsächlich eine eingebaute Funktion, die dies tut.

Wenn Sie anstelle einer Funktion eine Zeichenfolge an mapObject übergeben, wird dies als Eigenschaftsname interpretiert und verhält sich wie "pluckObject". Die meisten Funktionen sind überraschend liberal in dem, was sie akzeptieren.

> _.mapObject(elements,'temperature') 
Object {steam: 100, water: 50, ice: 0} 

Wenn Sie eine explizite Funktion für den Zweck möchte, können Sie prüfen, wie _.pluck ist implemented und Ihre eigene analoge Version schreiben:

_.mixin({ 
    pluckObject: function(obj, key) { 
    return _.mapObject(obj, _.property(key)); 
    } 
}); 

Dies ist ein wenig überflüssig, aber es macht Ihre Absichten klarer.

0

Für wen könnte es interessieren - Ab sofort ist die beste Praxis, die js Builtins anstelle von externen Bibliotheken zu verwenden.

Object.values(elements).map(elem => elem.temperature).

Verwandte Themen