我正在开发一个后端带有 RESTful api 的 Javascript 网络应用程序 (SPA)。在我的客户端数据上下文中,我想将对象添加到我的模型图中,然后立即将整个图发送到服务器。
假设如下例子:
我的模型中有一个 Person
对象,它本身有一个 say PhoneNumbers
数组作为属性。现在我从 api 加载一个 Person
进行编辑并将其映射到我的模型。假设我想向我的 PhoneNumbers
添加一些电话号码对象。为此,我添加了每个数字,例如{"id": 0, "number": 6536652226}
id 为零到我的客户端模型,并在用户单击保存时将整个图发送到服务器。在服务器中,我将 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 均为零!
有任何解决此问题的建议,还是我需要一种完全不同的方法?
最佳答案
首先,我发现了两个小误解:
1) 忘掉“关联数组”吧。数值数组是您拥有的唯一一种数组;其他构造只是“对象”(这不是 PHP)。
2) 如果是 JSON,则它是一个字符串,而不是一个对象。
除此之外,您当然可以使用任意值来表示"new"(尽管我可能会使用 null
而不是 0
)不要使用此类值来唯一标识尚未添加的项目。例如,这很好:
[
{"id": 0, "number": "6536652226"},
{"id": 0, "number": "9876543210"},
{"id": 0, "number": "0123456789"}
]
这不是:
// WRONG!!!!
{
0: "6536652226",
0: "9876543210",
0: "0123456789"
}
当然,如果号码仍然没有 ID,您将无法通过 ID 找到号码。您需要选择:
- 从数据库中检索生成的 ID 并更新您的本地数据
- 按编号删除
关于javascript - 是否可以将具有相同键的多个 javascript 对象添加到关联数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15205166/