从单个赋值操作中避免重复的JS对象属性?

时间:2013-04-23 14:39:42

标签: javascript database

我正在大型数据集上运行脚本以扩展现有信息。 e.g:

...
{
    id : 1234567890
},
{
    id : 1234567891
},
...

变为

...
{
    id : 1234567890,
    Name : "Joe"
},
{
    id : 1234567891,
    Name : "Bob"
},
...

我通过以下代码执行此操作:

for(var cur in members)
{
    curMember = members[cur];
    // fetch account based on curMember.id to 'curAccount'

    if(curAccount != null)
    {
        curMember.DisplayName = curAccount.DisplayName;
    }
}

在大多数情况下,这可以按预期工作。但是,有一段时间(数万个条目的顺序),结果如下所示:

...
{
    id : 1234567891,
    Name : "Bob",
    Name : "Bob"
},
...

我现在的数据格式无效且数据库无法读取,因为重复的属性名称没有意义。当重新运行脚本时,它会随机输入,而不是每次都是相同的。我需要一种方法来防止这种情况发生,或者检测它已经发生了所以我可以简单地重新处理该条目。有谁知道这里发生了什么?

编辑:经过进一步调查后,只有当被修改的对象来自MongoDB查询时才会出现问题。似乎如果代码多次将值显式设置为相同的元素名称,则该字段将被复制。所有相同名称的元素似乎都设置为最近指定的值。如果它仅在原始问题中分配一次,则它很少被复制。我使用的是MongoDB 2.4.1。

2 个答案:

答案 0 :(得分:2)

一切都弄清楚了。 MongoDB有一个bug版本到shell版本2.4.1,它允许为查询结果对象设置重复的元素名称。本周一发布的版本2.4.3有一个修复。请参阅https://jira.mongodb.org/browse/SERVER-9066

答案 1 :(得分:1)

我真的不明白你的问题。如果将相同的属性名称应用于ECMAscript中的对象,则该属性将被覆盖。您的代码段中的构造永远不会以实时对象(不包括JSON字符串)的形式存在。

如果您只想检测尝试创建已经存在的属性,您需要预先缓存该对象引用(这样您可以循环其键) - 或 - 您需要应用 ES5严格模式

"use strict";

位于文件或功能的顶部。这将确保您的解释器将尝试创建两个相同的属性键。 当然,您可以使用try - catch语句拦截该失败。

似乎你无法拦截因严格模式违规而被抛出的错误