recorrer objetos formulario elementos div array jquery backbone.js underscore.js

objetos - Función recursiva jquery con backbone



recorrer elementos de un formulario jquery (2)

Basado en la respuesta de @Bergi, se me ocurrió esto. debería resolver tu problema.

Aquí hay una demostración: http://plnkr.co/edit/NHE9V5?p=preview

Actualizado He modificado algunas cosas para acomodar tus archivos JSON separados.

Ayudante de producto cartesiano ( http://en.wikipedia.org/wiki/Cartesian_product )

function cartesian(arg) { arg = arg || []; var r = [], max = arg.length - 1; function helper(arr, i) { for (var j = 0, l = arg[i].length; j < l; j++) { var a = arr.slice(0); // clone arr a.push(arg[i][j]); if (i == max) { r.push(a); } else helper(a, i + 1); } } if(arg.length > 0) helper([], 0); return r; }

Solución de recolección anidada

HotelModel = Backbone.Model.extend({ initialize: function() { // because initialize is called after parse _.defaults(this, { rooms: new RoomCollection() }); }, parse: function(response) { if (_.has(response, "rooms")) { this.rooms = new RoomCollection(response.rooms, { parse: true }); delete response.rooms; } return response; }, toJSON: function() { var json = _.clone(this.attributes); json.rooms = this.rooms.toJSON(); return json; }, addRoom: function(rooms, options) { return this.rooms.add(rooms, options); }, removeRoom: function(rooms, options) { return this.rooms.remove(rooms, options); }, createRoom: function(attributes, options) { return this.rooms.create(attributes, options); }, getCombinations: function() { return cartesian(_.values(this.rooms.groupBy(''level''))); } }); RoomModel = Backbone.Model.extend({}); HotelCollection = Backbone.Collection.extend({ model: HotelModel, getAllCombinations: function(){ return this.map(function(hotel){ return _.extend(hotel.toJSON(), { combinations: hotel.getCombinations() }); }); } }); RoomCollection = Backbone.Collection.extend({ model: RoomModel, getRoomsByHotelId: function(hotelId) { return this.where({ hotelId: hotelId }); } });

Cargando el JSON Separado

var hotels = new HotelCollection([], { url: ''hotels.json'' }); var rooms = new RoomCollection([], { url: ''rooms.json'' }); hotels.fetch({ success: function() { rooms.fetch({ success: function() { hotels.each(function(hotel) { hotel.addRoom(rooms.getRoomsByHotelId(hotel.id)); }); // all done here var combos = hotels.getAllCombinations(); $(function() { $(''body'').append(''<pre>'' + JSON.stringify(combos, null, 2) + ''</pre>''); }); } }); } });

hotels.json

[{ "id": 1, "name": "Hotel One" }, { "id": 2, "name": "Hotel Two" }, { "id": 3, "name": "Hotel Three" }]

habitaciones.json

[{ "level": 1, "name": "Room A", "hotelId": 1 }, { "level": 1, "name": "Room B", "hotelId": 1 }, { "level": 2, "name": "Room A", "hotelId": 1 }, { "level": 2, "name": "Room B", "hotelId": 1 }, { "level": 1, "name": "Room A", "hotelId": 2 }, { "level": 1, "name": "Room B", "hotelId": 2 }, { "level": 2, "name": "Room A", "hotelId": 2 }, { "level": 2, "name": "Room B", "hotelId": 2 }, { "level": 1, "name": "Room A", "hotelId": 3 }, { "level": 1, "name": "Room B", "hotelId": 3 }, { "level": 1, "name": "Room C", "hotelId": 3 }]

Tengo una aplicación en la red troncal en la que quiero encontrar algunos registros e imprimirlos en un Json.

mi JSON es así:

[ { "id" : "r1", "hotel_id" : "1", "name" : "Single", "level" : "1" }, { "id" : "r1_1", "hotel_id" : "1", "name" : "Double", "level" : "2" }, { "id" : "r1_3", "hotel_id" : "1", "name" : "Double for single", "level" : "1" }, { "id" : "r1_4", "hotel_id" : "1", "name" : "Triple", "level" : "3" }, { "id" : "r2", "hotel_id" : "2", "name" : "Single", "level" : "1" }, { "id" : "r2_1", "hotel_id" : "2", "name" : "Triple", "level" : "1" } ]

Quiero combinar cada habitación para cada hotel por nivel. Cada hotel puede tener más combinación de habitaciones pero un nivel único. Mi objetivo es imprimir algo así para el hotel donde id = 1 (lo mismo para el otro con una combinación diferente): primera combinación para hotel con ID 1:

Room "Single", "level" : "1" , "hotel_id" : "1" Room "Double", "level" : "2" , , "hotel_id" : "1" Room "Triple", "level" : "3" , , "hotel_id" : "1"

Segunda combinación para hotel con ID 1:

Room "Double for single", "level" : "1" , "hotel_id" : "1" Room "Double", "level" : "2" , , "hotel_id" : "1" Room "Triple", "level" : "3" , , "hotel_id" : "1"

Cada hotel puede tener más habitaciones de algún nivel, pero quiero construir una combinación con un hotel foreach de una habitación.

Este es mi análisis en la red troncal, pero solo he recuperado el JSON dentro de allRooms.

//each for all my hotel _.each(this.collection.models, function(hotel) { var rooms = new Array(); rooms.push(allRooms.where({hotel_id : hotel.id})); //this is where I have to construct my combination //this is the array for each combination hotel.get(''rooms'').push(rooms); });

¿Cómo construir esta combinación?


Primero debe dividir su lista de habitaciones por hoteles y niveles:

var rooms = _(allRooms.groupBy, "hotel_id"); for (var hotelid in rooms) rooms[hotelid] = _.groupBy(rooms[hotelid], "level");

Las "combinaciones" que está buscando son el producto cartesiano de los niveles (para cada hotel). Puede usar esta función auxiliar por ejemplo. Úselo así:

_.each(this.collection.models, function(hotel) { var levels = rooms[hotel.id]; var combinations = cartesian(_.values(levels)); // put them on the hotel });