2016-04-04 15 views
1

Das ist ähnlich zu this question, aber mit einer leichten Wendung darin, dass es andere Objektwerte neben den Arrays und ich kann nicht ganz scheinen, die genaue Syntax herauszufinden, was ich brauche.Verschachtelte Objekt Array-Werte in ein anderes Array

Ich habe so etwas wie dies:

const metadata = [ 
    { 
    stepName: 'Step one', 
    controls: [ 
     {fieldName: 'one', label: 'Field One', type: 'input'}, 
     {fieldName: 'two', label: 'Field Two', type: 'multiline'} 
    ] 
    }, 
    { 
    stepName: 'Step two', 
    controls: [ 
     {fieldName: 'three', label: 'Field Three', type: 'input'}, 
     {fieldName: 'four', label: 'Field Four', type: 'multiline'} 
    ] 
    } 
] 

... und ich möchte für Feldname in dort eigene Array mit allen Werten erhalten, so dass ich am Ende mit etwas wie:

someFieldArray = ['one', 'two', 'three', 'four'] 

Fast bei jedem Versuch habe ich irgendwo Drosseln gemacht. Ich weiß, dass ich eine Kombination aus Iteration und Destrukturierung verwende, aber ich kann nicht genau die genaue Syntax und Kombination korrekt finden. Ich benutze ES2015 (6), die mit Babel transpiliert werden. Jede Hilfe, wie man das macht, wird geschätzt! Ich kann Metadaten zuerst in ein Objekt zerlegen, wenn das die Dinge einfacher macht ({... Metadaten}).

+0

Möchten Sie nur eindeutige Werte * fieldName * oder alle Werte? – RobG

Antwort

1

Da Sie eine ES6 Ansatz sind gefragt, könnte diese Lösung sein, was Sie suchen.

[].concat(...metadata.map(item => item.controls.map(obj => obj.fieldName))); 
+0

Dies änderte ich zur akzeptierten Antwort, da ich erwähnte, dass ich ES6 verwende –

3

In ES5 könnten Sie dies schreiben.

var metadata = [{ stepName: 'Step one', controls: [{ fieldName: 'one', label: 'Field One', type: 'input' }, { fieldName: 'two', label: 'Field Two', type: 'multiline' }] }, { stepName: 'Step two', controls: [{ fieldName: 'three', label: 'Field Three', type: 'input' }, { fieldName: 'four', label: 'Field Four', type: 'multiline' }] }], 
 
    result = metadata.reduce(function (r, a) { 
 
     return r.concat(a.controls.map(function (b) { return b.fieldName; })); 
 
    }, []); 
 

 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

+1

Perfekt, schnell und viel weniger kompliziert als das, was ich versuchte. Vielen Dank! –

Verwandte Themen