2016-03-29 11 views
1

Ich habe ein Objekt-Array wie folgt. Jedes Objekt in dem Array hat ein instructors-Feld, das auch ein Array ist. Wie kann ich alle E-Mail-Felder von diesem Objekt-Array über lodash erhalten?lodash: einen Objektwert von einem Objekt-Array bekommen

Muss ich eine doppelte _.map-Funktion verwenden? Ich kann eine foreach im Objekt und dann eine weitere foreach in den Ausbildern laufen, aber ich denke nicht, dass das sehr elegant ist. Ich kann mich nicht darum kümmern, Werte von Objekt-Arrays zu erhalten, die andere Array-Felder enthalten. Jede Hilfe würde sehr geschätzt werden.

[ 
{ 
    'title': 'New Class', 
    'instructors': [ 
     { 
      'email': '[email protected]' 
     }, 
     { 
      'email': '[email protected]' 
     }  
    ] 
}, 
{ 
    'title': 'New Class 2', 
    'instructors': [ 
     { 
      'email': '[email protected]' 
     }, 
     { 
      'email': '[email protected]' 
     }  
    ] 
}  

];

Antwort

3

Muss ich eine doppelte _.map-Funktion verwenden?

Das ist eine Lösung. Sie glauben, dass Sie suchen flatMap:

var classes = [{ 
 
    'title': 'New Class', 
 
    'instructors': [{ 
 
    'email': '[email protected]' 
 
    }, { 
 
    'email': '[email protected]' 
 
    }] 
 
}, { 
 
    'title': 'New Class 2', 
 
    'instructors': [{ 
 
    'email': '[email protected]' 
 
    }, { 
 
    'email': '[email protected]' 
 
    }] 
 
}]; 
 

 
var emails = _.flatMap(classes, function(cls) { 
 
    return _.map(cls.instructors, 'email'); 
 
}); 
 

 
document.querySelector('#out').innerHTML = JSON.stringify(emails, null, 4);
<script src="https://cdn.jsdelivr.net/lodash/4.6.1/lodash.min.js"></script> 
 
<pre id="out"></pre>

0

Dies sollte funktionieren:

var allEmails = []; 

_.each(myArray, function(obj) { 
    _.each(obj.instructors, function(instructor) { 
    allEmails.push(instructor.email); 
    }, this); 
}, this); 

return allEmails; 

https://jsfiddle.net/k4uahqkk/1/

Eine elegantere Lösung _.reduce und _.map mit wäre:

_.reduce(myArray, function(result, value, key) { 
    return result.concat(_.map(value.instructors, 'email')); 
}, []); 

https://jsfiddle.net/z1tg4tro/4/

edit: _.pluck seit v4.x veraltet ist, verwenden Sie stattdessen _.map.

+0

Der Code in Ihre Geige aus dem Code unterscheidet man hier ... –

+0

Ich war Entschuldigung Bearbeiten – deKajoo

3

So wissen Sie, die Vanille-Methode auch recht kurz ist:

var out = arr.reduce(function (p, c) { 
    return p.concat(c.instructors.map(function (instructor) { 
    return instructor.email; 
    })); 
}, []); 
+0

Schöne Lösung, wir zu oft lodash verwenden, ohne zu denken native, kompatibel bis ** IE9 ** – deKajoo

+0

@deKajoo, denke ich Du meintest "von IE9" :) – Andy

Verwandte Themen