Hier ist etwas Schlankeres, obwohl es nicht vermieden wird, die Liste der Felder zu wiederholen. Es verwendet "Parameter-Destrukturierung", um die Notwendigkeit des v
Parameters zu vermeiden .
({id, title}) => ({id, title})
(Siehe ein ausführbares Beispiel in dieser anderen Antwort ).
Die Lösung von @ EthanBrown ist allgemeiner. Hier ist eine idiomatischere Version davon Object.assign
, die Eigenschaften (den [p]
Teil) verwendet und berechnet :
function pick(o, ...props) {
return Object.assign({}, ...props.map(prop => ({[prop]: o[prop]})));
}
Wenn wir die Attribute der Eigenschaften wie z. B. configurable
Getter und Setter beibehalten und gleichzeitig nicht aufzählbare Eigenschaften weglassen möchten , dann:
function pick(o, ...props) {
var has = p => o.propertyIsEnumerable(p),
get = p => Object.getOwnPropertyDescriptor(o, p);
return Object.defineProperties({},
Object.assign({}, ...props
.filter(prop => has(prop))
.map(prop => ({prop: get(props)})))
);
}
Object.assign
; es6 ist wie ein Weihnachtsbaum mit so vielen Geschenken darunter, dass ich noch Monate nach dem Feiertag Geschenke findefilter(...).map(prop => ({[prop]: get(prop)})))
?pick()
Implementierung könnten Sie auch so etwas tunreturn props.reduce((r, prop) => (r[prop] = o[prop], r), {})
undefined
. Manchmal ist es wichtig. Ansonsten schöne Idee.Ich glaube nicht, dass es eine Möglichkeit gibt, es viel kompakter zu gestalten als Ihre Antwort (oder die von Torazburo), aber im Wesentlichen versuchen Sie, die
pick
Operation von Underscore zu emulieren . Es wäre einfach genug, dies in ES6 erneut zu implementieren:Dann haben Sie eine praktische wiederverwendbare Funktion:
quelle
pick
Funktion einmal aus, und Sie können so viele Eigenschaften auswählen, wie Sie möchten, und sie werden nicht verdoppelt.hasOwnProperty
? Wenn die Felder von Hand ausgewählt sind,in
scheint dies sogar angemessener zu sein. obwohl ich mich dafür entscheiden würde, die Prüfung komplett wegzulassen und sie einfach auf Standard setzen zu lassenundefined
.Der Trick, um dies als Einzeiler zu lösen, besteht darin, den gewählten Ansatz umzudrehen: Anstatt vom ursprünglichen Objekt auszugehen
orig
, kann man von den Schlüsseln ausgehen, die extrahiert werden sollen.Mit
Array#reduce
one kann dann jeder benötigte Schlüssel auf dem leeren Objekt gespeichert werden, das alsinitialValue
für diese Funktion übergeben wird.Wie so:
quelle
Eine etwas kürzere Lösung mit dem Komma-Operator:
quelle
pick
Funktionen in diesem Thread:pick({ name: 'John', age: 29, height: 198 }, 'name', 'age')
Der Vorschlag für Objektrest- / Spreizungseigenschaften von TC39 macht dies ziemlich raffiniert:
(Es hat den Nachteil, die
x
undy
Variablen zu erstellen , die Sie möglicherweise nicht benötigen.)quelle
omit
, aber nichtpick
let { a, b } as z = { x: 1, y: 2, a: 3, b: 4 }
Mithilfe der Objektdestrukturierung können Sie Eigenschaften aus dem vorhandenen Objekt entpacken und sie Variablen mit unterschiedlichen Namen zuweisen - Felder eines neuen, anfangs leeren Objekts.
quelle
Derzeit gibt es einen Strohmann-Vorschlag zur Verbesserung der JavaScript-Kurzschrift-Syntax, mit der benannte Eigenschaften ohne Wiederholung "ausgewählt" werden können:
Leider scheint der Vorschlag nicht in absehbarer Zeit irgendwohin zu gehen. Zuletzt bearbeitet im Juli 2017 und immer noch ein Entwurf in Phase 0 , was darauf hindeutet, dass der Autor ihn möglicherweise fallen gelassen oder vergessen hat.
ES5 und früher (nicht strenger Modus)
Die prägnanteste Abkürzung, die ich mir vorstellen kann, beinhaltet eine alte Sprachfunktion, die niemand mehr verwendet:
with
Anweisungen sind im strengen Modus verboten, sodass dieser Ansatz für 99,999% des modernen JavaScript unbrauchbar ist. Ein bisschen schade, denn dies ist die einzige halbwegs anständige Verwendung, die ich für diesewith
Funktion gefunden habe. 😀quelle
ES6 war die neueste Spezifikation zu dem Zeitpunkt, als die Frage geschrieben wurde. Wie in dieser Antwort erläutert , ist die Schlüsselauswahl in ES2019 erheblich kürzer als in ES6:
quelle
Ich habe eine ähnliche Lösung wie Ethan Brown, aber eine noch kürzere
pick
Funktion. Eine andere Funktionpick2
ist etwas länger (und langsamer), ermöglicht jedoch das Umbenennen von Eigenschaften ähnlich wie bei ES6.Hier ist das Anwendungsbeispiel:
quelle
Ich benötigte diese Lösung, wusste aber nicht, ob die vorgeschlagenen Schlüssel verfügbar waren. Also nahm ich die Antwort von @torazaburo und verbesserte mich für meinen Anwendungsfall:
quelle
inspiriert vom Reduktionsansatz von https://stackoverflow.com/users/865693/shesek :
Verwendung:
pick({ model : 'F40', manufacturer: 'Ferrari', productionYear: 1987 }, 'model', 'productionYear')
Ergebnisse in:{model: "F40", productionYear: 1987}
quelle