在关联数组中,是否可以添加具有相同键的多个JavaScript对象?

3
我正在开发一款基于 Javascript 的 Web 应用程序(SPA),具有 RESTful API 后端。在客户端数据上下文中,我想将对象添加到我的模型图中,然后一次性将整个图形发送到服务器。

假设以下示例:

我的模型中有一个 Person 对象,它本身具有一个数组属性,例如 PhoneNumbers。现在,我从 API 中加载一个用于编辑的 Person 并将其映射到我的模型中。假设我想向我的 PhoneNumbers 添加一些电话号码对象。为此,我将每个数字,例如 {"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都为零!
有什么建议可以解决这个问题,或者我需要完全不同的方法吗?

为什么不让服务器返回递增的版本号,然后在此基础上进行操作呢? - Ben McCormick
a) 没有“关联数组”,只有无序对象。 b) 不,您不能添加两次相同的键。 - Bergi
@ben336 为了实现这一点,对于我模型中添加的每个子项,我应该将其保存到数据库中。那么,如果用户想要取消编辑模型怎么办?我应该再次访问服务器并删除新添加的子项,我认为这不是有效的方法,只要用户决定保存整个模型对象时,我可以一次性发送整个图形。 - Pejman
2个回答

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,你就无法通过ID找到它们。你需要选择:

  • 从数据库检索生成的ID并更新本地数据
  • 按数字删除

从数据库中检索生成的ID并更新本地数据:为了实现这一点,每当向我的模型添加一个子项时,我都应该将其保存到数据库中。那么如果用户想取消编辑模型呢?我应该再次访问服务器并删除新添加的子项,但我认为这不是高效的方法,只要用户决定保存整个模型对象时,我就可以一次性发送整个图形。 - Pejman
按编号删除:我使用此方法处理不同的模型。自然地,它们并非都具有编号属性。 - Pejman
@Pejman - 对不起如果我理解错了什么,我看到"API"就以为数据被发送到服务器了。 - Álvaro González
@Pejman - 如果不是所有的项目都有可识别的标签,那么删除东西的GUI会是什么样子? - Álvaro González

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接