是否可以将具有相同键的多个javascript对象添加到关联数组中?

时间:2013-03-04 15:34:12

标签: javascript associative-array single-page-application

我正在开发一个在后端使用RESTful api的Javascript Web应用程序(SPA)。在我的客户端datacontext中,我想将对象添加到我的模型图中,然后立即将整个图发送到服务器。

假设以下示例:

我的模型中有一个Person对象,它本身有一个说PhoneNumbers的数组作为属性。现在我从api加载一个Person进行edditing并将其映射到我的模型。假设我想在PhoneNumbers添加一些电话号码对象。为此,我添加每个数字,例如我的客户端模型的id为零的{"id": 0, "number": 6536652226},并在用户单击“保存”时将整个图形发送到服务器。在服务器中,我将id为零的对象(新对象)添加到具有自动递增的ID的数据库中。

我正在根据教程做我的项目。他们做这样的事情来将对象添加到上下文中:

                var items = {},
                    // returns the model item produced by merging json obj into context
                    mapJsonToContext = function (json) {
                        var id = mapper.getJsonId(json);
                        var existingItem = items[id];
                        items[id] = mapper.fromDto(json, existingItem); //returns the mapped obj
                        return items[id];
                    },
                    add = function (newObj) {
                    items[newObj.id()] = newObj;
                    }

问题是,如果我使用这种方法,我将无法通过id删除客户端中新添加但尚未保存的项目,因为所有ID都为零!

有任何解决此问题的建议,还是我需要一种完全不同的方法?

2 个答案:

答案 0 :(得分:2)

首先,我发现了两个小误解:

1)忘记“关联数组”。数字数组是您拥有的唯一数组;其他构造只是“对象”(这不是PHP)。

2)如果它是JSON,它是字符串,而不是对象。

除此之外,当你不使用这样的值时,你当然可以使用任意值来表示“新”(虽然我可能使用null而不是0)唯一标识尚未添加的项目。例如,这很好:

[
    {"id": 0, "number": "6536652226"},
    {"id": 0, "number": "9876543210"},
    {"id": 0, "number": "0123456789"}
]

这不是:

// WRONG!!!!
{
    0: "6536652226",
    0: "9876543210",
    0: "0123456789"
}

}

当然,如果他们仍然没有身份证,你就无法通过身份证找到号码。你需要选择:

  • 从数据库中检索生成的ID并更新您的本地数据
  • 按号码删除

答案 1 :(得分:0)

在新创建的客户端对象上创建localId属性,并在协调服务器返回数据时将其用作您的密钥。显然,服务器必须将此localId返回给您。