2015-08-01 12 views
8

Tôi có một đối tượng đơn giản theo nghĩa đen mà là địa chỉ như đâyEJS làm thế nào để lặp đối tượng

address: { 
    country: String, 
    state: String, 
    city: String, 
    zip: String, 
    street: String 
} 

và nó bên trong một đối tượng mà tôi đang đi với express.js chức năng render.

trong trang mẫu của tôi, tôi đang cố gắng để cho vòng lặp bên trong đối tượng này như:

<% for (var prop in artist.address) { %> 
    <%- artist.address[prop] %> 
<% } %> 

đó sản lượng dữ liệu nhưng bao gồm các chức năng EJS cũng như vậy:

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 === 

nên làm thế nào để tôi cần phải lặp lại đối tượng của tôi?

+0

câu trả lời tốt ở đây: http://stackoverflow.com/questions/14379274/javascript-iterate-object – snozza

+0

là 'địa chỉ 'thực sự là một' mongoose.Schema' và 'artist.address' là một' mongoose.Document'? – mscdex

+0

không, nghệ sĩ là một nghệ sĩ mongoose.schema varSchema = mongoose.Schema ({ địa chỉ: { nước: String, nhà nước: String, thành phố: String, zip: String, đường phố: String }, .... –

Trả lời

4

sử dụng JS đơn giản bạn có thể sử dụng Object.keys

var obj = { 0: 'a', 1: 'b', 2: 'c' }; 
console.log(Object.keys(obj)); // console: ['0', '1', '2'] 

Trong ví dụ của bạn

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' 
}); 

Một cách tuyệt vời là sử dụng lodash: lodash forEach

_([1, 2]).forEach(function(n) { 
    console.log(n); 
}).value(); 
+5

Câu trả lời này làm thế nào để lặp lại trong Javascript, câu hỏi tiêu đề OP là cách lặp lại với EJS. Câu trả lời này là gây hiểu lầm cho những người mang đến đây tìm kiếm một câu trả lời cho câu hỏi trong tiêu đề. – Cleanshooter

7

Bạn đang xem tất cả các thuộc tính được kế thừa ngoài các thuộc tính "riêng" mà bạn đã thêm ở trên cùng.

Có hai cách để giải quyết vấn đề này. Một là sử dụng hasOwnProperty() để đảm bảo bạn không thấy tài sản thừa kế:

<% for (var prop in artist.address) { 
    if (Object.prototype.hasOwnProperty.call(artist.address, prop)) { %> 
     <%- artist.address[prop] %> 
<% } 
    } %> 

Hoặc sử dụng Object.keys() mà trả về một mảng các chỉ tính không di truyền và duyệt qua rằng:

<% Object.keys(artist.address).forEach(function(prop) { %> 
    <%- artist.address[prop] %> 
<% }); %> 

Vì đây là mongoose có liên quan, bạn cũng có thể thử lặp lại trên artist.address.toObject() (sử dụng API công khai) hoặc artist.address._doc (sử dụng API riêng tư) hoặc có thể lên một cấp trên đối tượng artist.

+0

vẫn thực hiện: <% Object.keys (nghệ sĩ .address) .forEach (function (chống đỡ) {%> <% - artist.address [prop]%> <% }); %> đang trở lại: function() {return this.get (đường dẫn);} function() {return this.get (path);} yafo 09988 –

+0

Tên của các thuộc tính bất ngờ là gì? – mscdex

2

OK vì vậy tôi lặn vào nó đây là giải thích, tôi có một đối tượng:

address : { 
    country: String, 
    state: String, 
    city: String, 
    zip: String, 
    street: String 
} 

tôi cần để hiển thị chỉ những thuộc tính và không được thừa kế một lần vì vậy tôi lặp qua các đối tượng và có đặc tính riêng của mình:

<% Object.keys(artist.address).forEach(function(prop) { %> 
    // ["country" , "state" , "city" etc ] 
    <%- artist.address[prop] %> // so artist.address.state logs "New York City" 
<% }); %> 

nhưng vấn đề là đối tượng artist.address tôi đã có hai thuộc tính hơn: mỗi người giữ một chức năng với một sự trở lại.

function() { return this.get(path); } function() { return this.get(path); } 

vì vậy tôi đã kiểm tra đối với tài sản chứa một chuỗi như vậy:

<% Object.keys(artist.address).forEach(function(prop) { 
    if(typeof artist.address[prop] == "string") { %> 
    <%- artist.address[prop] %> 
    <% } %> 
<% }); %> 
+0

bạn cần phải tìm ra khi nào bạn muốn sử dụng máy khách hoặc máy chủ ejs. nếu bạn sử dụng nó ở phía máy chủ và cho phép nói nhanh: đối tượng trả về sẽ trông như sau: điều khiển: return res.render ('template/something.ejs', {_: require ('lodash '), nghệ sĩ: artistDocument}); xem mẫu <% _. (Artist.address) .forEach (chức năng (prop) {%><% - artist.address [prop]%><% }); %> phía máy khách chỉ sử dụng dịch vụ cdn để lấy lodash