2016-06-20 17 views
2

Betrachten Sie das folgende Objekt:Existiert eine ES6-Kurzschrift zum Kopieren einer Teilmenge der Eigenschaften eines Objekts in ein neues Objekt?

const obj = {a: 1, b: 2, c: 3, d: 4, e: 5} 

Gibt es eine einfache Syntax für ein neues Objekt erstellen, die enthält:

const obj2 = {a, b, d} 

ich bewusst bin, dass & unterstreichen lodash .pick() haben, aber ich bin der Hoffnung, Es gibt eine Art von Destrukturierungstrick, die mir vielleicht nicht bewusst ist.

+0

Ich kann an nichts in ES6 denken, das besser lesbar ist, als es auf die alte Art zu tun - "const obj2 = {a: obj.a, b: obj.b, d: obj.d}"; 'obj' ist so oft nicht so nett. –

Antwort

2

könnten Sie Rest parameters verwenden und erstellen Sie benutzerdefinierte Funktion wählen wie diese

const obj = {a: 1, b: 2, c: 3, d: 4, e: 5} 
 

 
function pick(object, ...p) { 
 
    return p.reduce((o, e) => {return o[e] = object[e], o}, {}); 
 
} 
 

 
console.log(pick(obj, 'a', 'b', 'd'))

4

Sie können es in zwei Schritten tun:

const obj = {a: 1, b: 2, c: 3, d: 4, e: 5}; 
var {a, b, d} = obj; 
const obj2 = {a, b, d}; 

Wenn Sie nicht wollen, verschmutzen das Zielfernrohr,

const obj = {a: 1, b: 2, c: 3, d: 4, e: 5}; 
const obj2 = {}; 
{ 
    let {a, b, d} = obj; 
    Object.assign(obj2, {a, b, d}); 
} 
4

Concise Einzeiler in ES2015 ist

const obj2 = (({a, b, d}) => ({a, b, d}))(obj); 

Es ist nicht möglich zu sein scheint {a, b, d} Tautologie zu vermeiden, während sie kompakt zugleich zu halten.

+0

Wow, ich war ganz aufgeregt, dieses ES2015-Konstrukt das erste Mal zu benutzen, aber es ist immer noch nicht ganz so elegant, wie ich es mir erhofft hatte. Na ja, vielleicht eine zukünftige Version. Vielen Dank! –

+1

@MichaelScheper Deshalb ist Lashash '_.pick' immer noch anwendbar. Die Antworten in der Duplikatfrage decken alles ab. – estus