Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带主干的递归函数jquery_Jquery_Backbone.js_Underscore.js - Fatal编程技术网

带主干的递归函数jquery

带主干的递归函数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",

我在主干网中有一个应用程序,我想在Json中找到一些记录并打印出来

我的JSON是这样的:

[
  {
    "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即可。