2014-02-14 2 views
0

я есть набор JSON,Как группировать данные по той же стоимости с использованием _.each()

[{"gp_id":"1","gp_name":"ADMIN","gp_location":"Headquater"},{"gp_id":"2","gp_name":"OE.TT","gp_location":"Timah Tasoh"},{"gp_id":"3","gp_name":"OP.TT","gp_location":"Timah Tasoh"},{"gp_id":"4","gp_name":"USER.HQ","gp_location":"Headquater"}] 

Как вы можете видеть, некоторые повторяющиеся значения индекса «gp_location». Как я добиться результата, как это с помощью _.each (underscoreJs)

<select> 
<optgroup label="Headquater"> 
    <option>ADMIN</option> 
    <option>USER.HQ</option> 
</optgroup> 
<optgroup label="Timah Tasoh"> 
    <option>OP.TT</option> 
    <option>OE.TT</option> 
</optgroup> 
</select> 

до сих пор, что я должен достичь это

render: function() { 
     this.$el.empty(); 
     var container = document.createDocumentFragment(), 
      modelgroups = _.groupBy(this.collection.models, "gp_location");   
     _.each(modelgroups, function(group, n) {    
      var optgroup = document.createElement('optgroup');    
      optgroup.label = n;    
      _.each(group, function(base) {     
       optgroup.appendChild(new BaseListItemView({model: base}).render().el) 
      });    
      container.appendChild(optgroup);     
     }); 
     this.$el.append(container); 
     return this; 
    } 

Я занимаюсь разработкой приложений backboneJS. Как вы можете видеть BaseListItemView представляет собой элемент html option. Я не уверен, о том, как производить другой вид для optgroup

Update: здесь код BaseListItemView

return Backbone.View.extend({ 
     tagName: "option", 

    initialize: function() {    
     this.listenTo(this.model, 'change', this.render); 
    }, 

    render: function() { 
     this.$el.html(this.model.attributes.gp_name + ', ' + this.model.attributes.gp_location); 
     this.$el.attr("value" , this.model.attributes.gp_id) 
     return this; 
    } 

}); 

Надежда кто-то может помочь мне.

Большое спасибо

+0

Можете ли вы показать нам код Вашего 'BaseListItemView' (или это' render' метод как минимум), пожалуйста? – Bergi

+0

ok см. Обновление выше – Muhaimin

ответ

2

Используйте groupBy function так:

var modelgroups = _.groupBy(this.collection.models, "gp_location"); 

, так что вы можете перебирать его

_.each(modelgroups, function(group, name) { 
    var $group = $("<optgroup>", {label:name}); 
    _.each(group, function(base) {    
     $group.append(new BaseListItemView({model: base}).render().el) 
    }); 
    this.$el.append($group); 
}); 

и вы можете удалить gp_location из вашего <option> -view ,

+0

Вы имеете в виду, что я должен удалить существующий «код». – Muhaimin

+0

Нет, вам нужно только адаптировать его. Но вы не показывали нам свой существующий код, поэтому мне нужно было придумать свой собственный, а не помогать вам. Пожалуйста, внесите изменения в свой вопрос. – Bergi

+0

У меня проблема с 'именем' в следующей строке _.each (modelgroups, function (group, name) { – Muhaimin

0

спасибо за ваш ответ @bergi

не уверен, что пошло не так, но здесь небольшие изменения в вашем ответе

modelgroups = _.groupBy(this.collection.models, function(model){ 
    return model.get('gp_location') 
    }); 
+0

Кажется, что объекты в массиве не были чистыми объектами, но модели - на которых простой доступ к свойствам не работает – Bergi

+0

привет @ Bergi, спасибо за вашу мысль. Что вы имеете в виду не чистый объект. Есть ли что-нибудь, что я могу исправить – Muhaimin

+0

«pure o bject "Я имею в виду простой объект js, подобный тем, которые вы разбираете из JSON, - как тот, который вы представили в своем вопросе. На самом деле, кажется, что это базовая модель. Это, однако, ничего плохого, и когда вышеприведенный код работает, вам ничего не нужно исправить. – Bergi

Смежные вопросы