在javascript中从对象中删除属性

在javascript中从对象中删除属性,javascript,loops,Javascript,Loops,我在javascript中循环遍历一个对象并删除一个未定义的项,使用: for (var key in result) { if (result.hasOwnProperty(key)) { var obj = result[key]; if (typeof obj.name === 'undefined') { delete result[key]; } } } 如果我不使用delete,这个迭代就可以了。但是,当我使用delete时,我

我在javascript中循环遍历一个对象并删除一个未定义的项,使用:

for (var key in result) {
  if (result.hasOwnProperty(key)) {
     var obj = result[key];
     if (typeof obj.name === 'undefined') {
        delete result[key];
     }
  }
}
如果我不使用delete,这个迭代就可以了。但是,当我使用delete时,我会得到一个错误,'TypeError:cannotreadproperty'name'of undefined'

知道我做错了什么吗

多谢各位

编辑:正在迭代的对象:

{
  date: Mon, 02 Apr 2012 17: 48: 17 GMT,
  t_date: Mon, 02 Apr 2012 17: 48: 17 GMT,
  start: 0,
  _id: 4f79e661d7cb8ccc1f000005
} {
  date: Mon,n02 Apr 2012 17: 48: 26 GMT,
  t_date: Mon, 02 Apr 2012 17: 48: 26 GMT,
  start: 0,
  _id: 4f79e66ad7cb8ccc1f000006
} {
  name: 'testname',
  date: Mon, 02 Apr 2012 17: 48: 29 GMT,
  t_date: Mon, 02 Apr 2012 17: 48: 29 GMT,
  start: 0,
  _id: 4f79e66dd7cb8ccc1f000007
}
这意味着obj未定义,因此obj.name会导致此错误

应该是:

 var obj = result[key];
 if (obj && typeof obj.name === 'undefined') {
    delete result[key];
 }
这意味着obj未定义,因此obj.name会导致此错误

应该是:

 var obj = result[key];
 if (obj && typeof obj.name === 'undefined') {
    delete result[key];
 }

我不能100%确定为什么要在那里使用typeof运算符,但我认为可以将if语句简化为:

if(obj === undefined)
我还认为hasOwnProperty检查是多余的,不知道你在检查什么


我在这里创建了一个示例来演示这一点:只需使用浏览器控制台来查看结果对象。

我不完全确定为什么要在那里使用typeof运算符,但我认为可以将if语句简化为:

if(obj === undefined)
我还认为hasOwnProperty检查是多余的,不知道你在检查什么



我在这里创建了一个示例来演示这一点:只需使用浏览器控制台来查看结果对象。

能否粘贴您正在迭代的对象的外观?添加到上面-这是来自MongoDBAre的结果-这些实际日期对象?或者您正在尝试用JSON存储日期?因为您不能这样做,所以您需要使用一个字符串,这些字符串是MongoDB日期类型,它们使用新日期插入到日期类型中,这是MongoDB查询的结果。这是使用nodejs mongodb适配器。您能粘贴您正在迭代的对象的外观吗?在上面添加了它-这是MongoDBAre实际日期对象的结果吗?或者您正在尝试用JSON存储日期?因为您不能这样做,所以您需要使用一个字符串,这些字符串是MongoDB日期类型,它们使用新日期插入到日期类型中,这是MongoDB查询的结果。这是使用nodejs mongodb适配器。很可能就是这样。结果中将有一个未定义的属性。类似于{a:1,b:undefined,c:3}的东西将在bDidn上失败,同样的问题。我在上面添加了一个数据迭代的例子,有些对象包含属性名,有些不包含属性名。您确定这段代码中会发生错误吗?您是否尝试调试代码并找出它在哪一行崩溃?如果您尝试简单的if obj&&!obj.name{…}?如果我用console.logresult[key]代替delete result[key],它会显示缺少name属性的对象。没有错误。当我添加delete时,我得到了错误,就像它删除了整个对象“result”,而不是result[key]……对我有效:你能分享一个像我刚才那样失败的例子吗?例如,编辑示例并进行更新。这很可能就是它。结果中将有一个未定义的属性。类似于{a:1,b:undefined,c:3}的东西将在bDidn上失败,同样的问题。我在上面添加了一个数据迭代的例子,有些对象包含属性名,有些不包含属性名。您确定这段代码中会发生错误吗?您是否尝试调试代码并找出它在哪一行崩溃?如果您尝试简单的if obj&&!obj.name{…}?如果我用console.logresult[key]代替delete result[key],它会显示缺少name属性的对象。没有错误。当我添加delete时,我得到了错误,就像它删除了整个对象“result”,而不是result[key]……对我有效:你能分享一个像我刚才那样失败的例子吗?例如,编辑示例并进行更新。他不是在检查obj是否未定义,而是在检查它是否具有未定义的name属性。如果您或正在使用的某个库修改了现有原型,则hasOwnProperty检查非常重要。通常最好将其保留在那里。typeof仅用于防止有人覆盖未定义的内容,因为您可以这样做=/。hasOwnProperty就在那里,所以你不会迭代原型链对象上的属性。prototype.Ah,我显然误解了这个问题。我使用了一个未定义的项来检查每个属性的值。感谢您对hasOwnProperty的澄清。他不是在检查obj是否未定义,而是在检查它是否有未定义的name属性。如果您或正在使用的某个库修改了现有原型,则hasOwnProperty检查非常重要。通常最好将其保留在那里。typeof仅用于防止有人覆盖未定义的内容,因为您可以这样做=/。hasOwnProperty就在那里,所以你不会迭代原型链对象上的属性。prototype.Ah,我显然误解了这个问题。我使用了一个未定义的项来检查每个属性的值。感谢您对hasOwnProperty的澄清。