J'ai un simple objet littéral qui est l'adresse comme indiqué ici
address: {
country: String,
state: String,
city: String,
Zip: String,
street: String
}
et son à l'intérieur d'un objet que je passe avec la fonction de rendu express.js.
dans ma page de modèle, j'essaie de faire une boucle à l'intérieur de cet objet comme indiqué:
<% for (var prop in artist.address ) { %>
<%- artist.address[prop] %>
<% } %>
qui sortent les données mais inclut les fonctions ejs ainsi:
function () { return this.get(path); } function () { return this.get(path); } yafo 09988 jerusalem israel israeli [object Object] undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined undefined [object Object] [object Object] function () { var self = this , hookArgs // arguments eventually passed to the hook - are mutable , lastArg = arguments[arguments.length-1] , pres = this._pres[name] , posts = this._posts[name] , _total = pres.length , _current = -1 , _asyncsLeft = proto[name].numAsyncPres , _next = function () { if (arguments[0] instanceof Error) { return handleError(arguments[0]); } var _args = Array.prototype.slice.call(arguments) , currPre , preArgs; if (_args.length && !(arguments[0] == null && typeof lastArg ===
alors comment dois-je itérer mon objet?
en utilisant du JS simple, vous pouvez utiliser Object.keys
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']
Dans votre exemple
var artist = { address: { city: 'Tel Aviv' } };
Object.keys(artist.address).forEach(function(key){
<%- artist.address[city] %> //key will city the output will be 'Tev Aviv'
});
Une autre façon intéressante est d'utiliser lodash: lodash forEach
_([1, 2]).forEach(function(n) {
console.log(n);
}).value();
Vous voyez toutes les propriétés héritées en plus des propriétés "propres" que vous avez ajoutées en haut.
Il y a deux façons de résoudre ce problème. La première consiste à utiliser hasOwnProperty()
pour vous assurer que vous ne voyez pas les propriétés héritées:
<% for (var prop in artist.address) {
if (Object.prototype.hasOwnProperty.call(artist.address, prop)) { %>
<%- artist.address[prop] %>
<% }
} %>
Ou utilisez Object.keys()
qui retourne un tableau de propriétés uniquement non héritées et répétez cela:
<% Object.keys(artist.address).forEach(function(prop) { %>
<%- artist.address[prop] %>
<% }); %>
Comme il s'agit d'une mangouste, vous pouvez également essayer d'itérer sur artist.address.toObject()
(en utilisant l'API publique) ou artist.address._doc
(En utilisant une API privée) ou peut-être monter d'un niveau sur le artist
objet.
OK donc je me suis plongé dedans voici une explication, j'avais un objet:
address : {
country: String,
state: String,
city: String,
Zip: String,
street: String
}
j'avais besoin d'afficher uniquement ces propriétés et non héritées une fois, donc j'itère sur l'objet et j'ai ses propres propriétés:
<% Object.keys(artist.address).forEach(function(prop) { %>
// ["country" , "state" , "city" etc ]
<%- artist.address[prop] %> // so artist.address.state logs "New York City"
<% }); %>
mais le problème était que mon artist.address
objet avait deux autres propriétés: chacune contient une fonction avec un retour.
function () { return this.get(path); } function () { return this.get(path); }
j'ai donc vérifié les propriétés qui contiennent une chaîne comme ceci:
<% Object.keys(artist.address).forEach(function(prop) {
if( typeof artist.address[prop] == "string" ) { %>
<%- artist.address[prop] %>
<% } %>
<% }); %>