从现有JSON对象数组创建空JSON对象

时间:2013-06-08 20:02:07

标签: javascript arrays json object angularjs

我有一个JSON对象,其中包含两个对象x的数组。

我使用angularJS,我想在JSON中添加/编辑/删除对象(就像angular.org上的Angular TODO应用程序示例一样)。

有没有办法创建一个新的空(结构为x但没有值)x的JSON对象,只需将其推送到上面的JSON对象数组?

如何创建x的空值JSON对象?

我的Sample对象x是(我使所有值无效)粘贴在下面。所以我的JSON只是这些对象的数组。在Angular中,我希望用户填写表单并将数据保存在此类型的空对象中并将其推送到数组。那是我的目标。

示例JSON

      [{
        "id": null,
        "title": "",
        "date": {},
        "billPayerId": null,
        "notes": "Sample Notes",
        "billFinances": {
            "billPayerId": null,
            "billItemEntry": [
                {
                    "itemDescriptionId": 1,
                    "itemDescription": "",
                    "userIdAndLiableCost": [
                        {
                            "userId": null,
                            "liableCost": null
                        },
                        {
                            "userId": null,
                            "liableCost": null
                        }
                    ]
                },
                {
                    "itemDescriptionId": null,
                    "itemDescription": "",
                    "userIdAndLiableCost": [
                        {
                            "userId": null,
                            "liableCost": null
                        },
                        {
                            "userId": null,
                            "liableCost": null
                        }
                    ]
                }
            ],
            "billTotal": null
        },
        "groupId": null
    }];

2 个答案:

答案 0 :(得分:4)

您可以使用对象文字来存储您想要的任何内容。它只是一包属性(即名称)和值。例如var order = {};

然后可以使用数组文字来保存订单。 e.g var orders = []; orders.push(order);但是使用id为属性的另一个对象文字也同样容易。

但似乎你想要某种验证。也许管理订单数据和处理验证等等。像这样:

orderManager.dataStore = {
  _data: {},
  //_redundantData = [];  //could easily store in an array if id isn't unique
  get: function (id) {
    return this._data[id];
  },
  getAll: function () {
    return this._data;
  },
  set: function (id, order) {
    validateOrder(order);
    this._data[id] = order;
  },

  clear: function (id) {
    this._data[id] = undefined;
  },
  add: function (order) {
      validateOrder(order);
      this._data[order.id] = order;

  },
  assertNotNull: function (data, key) {
      if(data[key] == undefined) {
        throw new Error("Key Missing: " + key + " for " + data.name);
      }
  },
  validateOrder: function(order) {
    assertNotNull(order,"id");
    assertNotNull(order,"title");
    //etc
  },
  containsOrder: function (id) {
    for(var i=0;i<array.length;i++) {
        if(array[i].id === id) {
            return true;
        }
    }
    return false;
  }
};

答案 1 :(得分:3)

如果我正在阅读所有这些内容,我认为您可能误解了Angular的工作原理。您不必为Angular创建一个空对象以在表单中使用。只要表单的输入使用点表示法,它就会在用户用数据填充输入时为您生成对象。

E.g。

<form>
    <input type="text" ng-model="myForm.name">
    <input type="text" ng-model="myForm.email">
    <input type="text" ng-model="myForm.nickname">
</form>

由于我们在ng-model属性中使用了点符号,因此当用户填写表单时,它会为我们创建对象。输入完成后,生成的对象将如下所示:

$scope.myForm = {
    name: 'Justin',
    email: 'justin@email.com',
    nickname: 'Cerebrl'
};

现在,通常一旦用户点击保存,您就会将数据发送到服务器以保持持久性,然后您可以清空对象(例如$scope.myForm = {};)以重置表单。但是,出于某种原因,你想先建立一个数组,然后在完全完成后将整个数据发送到服务器(至少我是如何理解它的。)

要做到这一点,你必须解决JavaScript中的ObjectsArrays是引用类型这一事实,因此你不能将数据的对象推送到数组,然后清空

表示重置表单的对象,因为它会清空数组中的对象。

我个人会用Angular的对象复制方法(例如angular.copy(source);)来解决这个问题:http://docs.angularjs.org/api/angular.copy这允许你创建一个对象的非引用副本并使用它而不会改变原始对象宾语。因此,在“保存功能”中,您将拥有:

var myNewObj = angular.copy($scope.myForm);
myDataArray.push(myNewObj);
$scope.myForm = {};

这样,您已保存完成的表单数据,将其推送到数组并清除表单的输入数据。这是否回答了你的问题?