将嵌套的json解析为主干集合

时间:2013-01-16 13:48:51

标签: json backbone.js nested backbone.js-collections

我刚刚开始Backbone,我遇到了问题。我有一个很好的安静设置。对于我的大多数GET请求,我收到一个模型集合,但是对于一个我正在加载嵌套的关系数据,这会创建嵌套的JSON

Backbone我有以下Models

App.Models.Sequence = Backbone.Model.extend({});
App.Models.Layer = Backbone.Model.extend({});
App.Models.Item = Backbone.Model.extend({});

和这些集合

App.Collections.Sequences = Backbone.Collection.extend({
  model: App.Models.Sequence,
  url: '/api/sequences/'
});

App.Collections.Layers = Backbone.Collection.extend({
  model: App.Models.Layer,
  url: '/api/layers'
});


App.Collections.Items = Backbone.Collection.extend({
  model: App.Models.Item,
  url: '/api/items'
});

我将数据加载为JSON

[
              {
                "id": "1",
                "project_id": "8",
                "name": "Seq1",
                "layers": [
                  {
                    "id": "1",
                    "name": "Layer11",
                    "sequence_id": "1",
                    "items": [
                      {
                        "id": "1000000",
                        "layer_id": "1",
                        "itemtype_id": "1",
                        "position": "0"
                      },
                      {
                        "id": "1000001",
                        "layer_id": "1",
                        "itemtype_id": "2",
                        "position": "0"
                      },
                      {
                        "id": "1000002",
                        "layer_id": "1",
                        "itemtype_id": "2",
                        "position": "0"
                      },
                      {
                        "id": "1000003",
                        "layer_id": "1",
                        "itemtype_id": "4",
                        "position": "0"
                      }
                    ]
                  },
                  {
                    "id": "2",
                    "name": "Layer12",
                    "sequence_id": "1",
                    "items": [
                      {
                        "id": "1000004",
                        "layer_id": "2",
                        "itemtype_id": "1",
                        "position": "0"
                      },
                      {
                        "id": "1000005",
                        "layer_id": "2",
                        "itemtype_id": "2",
                        "position": "0"
                      },
                      {
                        "id": "1000006",
                        "layer_id": "2",
                        "itemtype_id": "3",
                        "position": "0"
                      },
                      {
                        "id": "1000007",
                        "layer_id": "2",
                        "itemtype_id": "4",
                        "position": "0"
                      }
                    ]
                  },
                  {
                    "id": "3",
                    "name": "Layer13",
                    "sequence_id": "1",
                    "items": [
                      {
                        "id": "1000008",
                        "layer_id": "3",
                        "itemtype_id": "1",
                        "position": "0"
                      },
                      {
                        "id": "1000009",
                        "layer_id": "3",
                        "itemtype_id": "4",
                        "position": "0"
                      },
                      {
                        "id": "1000010",
                        "layer_id": "3",
                        "itemtype_id": "5",
                        "position": "0"
                      }
                    ]
                  }
                ]
              },
              {
                "id": "2",
                "project_id": "8",
                "name": "Seq2",
                "layers": [
                  {
                    "id": "4",
                    "name": "Layer21",
                    "sequence_id": "2",
                    "items": []
                  },
                  {
                    "id": "5",
                    "name": "Layer22",
                    "sequence_id": "2",
                    "items": []
                  }
                ]
              },
              {
                "id": "3",
                "project_id": "8",
                "name": "Seq3",
                "layers": [
                  {
                    "id": "6",
                    "name": "Layer31",
                    "sequence_id": "3",
                    "items": []
                  },
                  {
                    "id": "7",
                    "name": "Layer32",
                    "sequence_id": "3",
                    "items": []
                  }
                ]
              }
            ]

如何将SequencesLayersItems收藏到我的收藏中?

1 个答案:

答案 0 :(得分:8)

您可以使用下划线flattenpluck的组合来做到这一点:

var data = { /* your JSON data */ };
var allSequences = _.clone(data);
var allLayers = _.flatten(_.pluck(allSequences, 'layers'));
var allItems = _.flatten(_.pluck(allLayers, 'items'));

var sequences = new App.Collections.Sequences(allSequences);
var layers = new App.Collections.Layers(allLayers);
var items = new App.Collections.Items(allItems);

如果您不希望序列和图层包含其子对象,请覆盖Model.parse以修剪它们。例如:

App.Models.Sequence = Backbone.Model.extend({
    parse: function(attrs) {
      delete attrs.layers;
      return attrs;
    }
});

使用parse:true选项初始化/添加集合:

var sequences = new App.Collections.Sequences(allSequences, {parse:true});

等等。