带主干的递归函数jquery
我在主干网中有一个应用程序,我想在Json中找到一些记录并打印出来 我的JSON是这样的:带主干的递归函数jquery,jquery,backbone.js,underscore.js,Jquery,Backbone.js,Underscore.js,我在主干网中有一个应用程序,我想在Json中找到一些记录并打印出来 我的JSON是这样的: [ { "id" : "r1", "hotel_id" : "1", "name" : "Single", "level" : "1" }, { "id" : "r1_1", "hotel_id" : "1", "name" : "Double", "level" : "2" }, { "id" : "r1_3",
[
{
"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"
}
]
_.each(this.collection.models, function(hotel) {
var levels = rooms[hotel.id];
var combinations = cartesian(_.values(levels));
// put them on the hotel
});
我想将每个酒店的每个房间合并为一个级别。每家酒店可以有更多的房间组合,但层次独特。
我的目标是为id=1的酒店打印类似的内容(另一个相同,组合不同):
id为1的酒店的首个组合:Room "Single", "level" : "1" , "hotel_id" : "1"
Room "Double", "level" : "2" , , "hotel_id" : "1"
Room "Triple", "level" : "3" , , "hotel_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"
id为1的酒店的第二个组合:Room "Single", "level" : "1" , "hotel_id" : "1"
Room "Double", "level" : "2" , , "hotel_id" : "1"
Room "Triple", "level" : "3" , , "hotel_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"
每个酒店可以有更多的房间,但我想为每个酒店建造一个房间的组合
这是我在主干中的解析,但我只能在所有房间中检索JSON
//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);
});
如何构建这种组合?首先,您应该按酒店和楼层划分房间列表:
var rooms = _(allRooms.groupBy, "hotel_id");
for (var hotelid in rooms)
rooms[hotelid] = _.groupBy(rooms[hotelid], "level");
您正在寻找的“组合”是(每个酒店)级别的组合。例如,您可以使用。像这样使用它:
[
{
"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"
}
]
_.each(this.collection.models, function(hotel) {
var levels = rooms[hotel.id];
var combinations = cartesian(_.values(levels));
// put them on the hotel
});
首先,您应该按酒店和级别划分房间列表:
var rooms = _(allRooms.groupBy, "hotel_id");
for (var hotelid in rooms)
rooms[hotelid] = _.groupBy(rooms[hotelid], "level");
您正在寻找的“组合”是(每个酒店)级别的组合。例如,您可以使用。像这样使用它:
[
{
"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"
}
]
_.each(this.collection.models, function(hotel) {
var levels = rooms[hotel.id];
var combinations = cartesian(_.values(levels));
// put them on the hotel
});
根据@Bergi的回答,我想到了这个。它应该能解决你的问题 下面是一个演示: 更新了我修改了一些内容,以适应单独的JSON文件 笛卡尔乘积帮助器() 加载单独的JSON
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>');
});
}
});
}
});
rooms.json
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
});
}
});
[{
"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
}]
根据@Bergi的回答,我想到了这个。它应该能解决你的问题 下面是一个演示: 更新了我修改了一些内容,以适应单独的JSON文件 笛卡尔乘积帮助器() 加载单独的JSON
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>');
});
}
});
}
});
rooms.json
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
});
}
});
[{
"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
}]
好的,我已经了解了一点,我已经看到了实现这一点的函数。你能用完整的代码(不带helpeer功能)完成答案吗?可以吗?谢谢如果我把你的代码,我有一些问题,为此,我需要“完整”的解决方案forst问题是在groupby中,因为返回我一个数组:add,after。。。为什么?房间应该是一个对象{1:{1:[r1,r1\u3],2:[r1\u1],3:[r1\u4]},2:{1:[r2,r2\u1]}。那有用吗?我不确定您想要分配组合的变量(或属性)是什么,所以我无法将其放入我的代码中-请您引导我到这个位置好吗?好的,如果对您来说这是可行的,您能用正确的代码回答问题吗@moderndegreeOk,我已经了解了一点,我已经看到了实现这一点的功能。你能用完整的代码(不带helpeer功能)完成答案吗?可以吗?谢谢如果我把你的代码,我有一些问题,为此,我需要“完整”的解决方案forst问题是在groupby中,因为返回我一个数组:add,after。。。为什么?房间应该是一个对象{1:{1:[r1,r1\u3],2:[r1\u1],3:[r1\u4]},2:{1:[r2,r2\u1]}。那有用吗?我不确定您想要分配组合的变量(或属性)是什么,所以我无法将其放入我的代码中-请您引导我到这个位置好吗?好的,如果对您来说这是可行的,您能用正确的代码回答问题吗@moderndegreeYes更好,如果你能把它放在主干网中。如果你能把它放在你的浏览器中,就可以简单地尝试它+1来修复我的代码并将其集成到主干网中。我本应该好好看看我自己的
笛卡尔函数,我忘了它不需要数组(或者至少需要调整)。完美的工作。。。如果我从外部获取这个json,是不是也一样?因为是来自服务器的数据,我将其存储到json文件OK中,我已经看到了这一点,但现在的主要问题是如何从我的两个json文件构建集合中的数组。有没有可能像另一个问题中那样将两个外部json集成到您的代码中,以获得像您这样的集合?请帮助我你可以使用hotels.fetch()来检索带有嵌套模型的JSON,它应该可以正常工作。只需确保在获取之前在集合上设置URL。如果可以将其放在主干中,则更好。如果可以将其放在浏览器中,则可以简单地尝试它+1,以修复我的代码并将其集成到主干中。我本应该好好看看我自己的笛卡尔函数,我忘了它不需要数组(或者至少需要调整)。完美的工作。。。如果我从外部获取这个json,是不是也一样?因为是来自服务器的数据,我将其存储到json文件OK中,我已经看到了这一点,但现在的主要问题是如何从我的两个json文件构建集合中的数组。有没有可能像另一个问题中那样将两个外部json集成到您的代码中,以获得像您这样的集合?请帮助我你可以使用hotels.fetch()来检索带有嵌套模型的JSON,它应该可以正常工作。只需确保在获取之前设置集合的URL即可。