如何从对象中删除属性?

21

目前在复选框上设置了一个事件,event.target会给出被点击的复选框的状态 (checked = true/false)

我正在维护一个对象,以跟踪所有选中的复选框。

var selectedMap  = {};

if(event.target == true){
    var key = event.target.id;
    var val = event.target.name;
    selectedMap[key] = val;
}

我想从地图中删除未被选择的元素。

else if(event.target == false){
  selectedMap.remove(event.target.id);
}

当我运行这个代码时,在Firebug中出现错误:selectedMap.remove is not a function

那么我的问题是如何在取消选择复选框时删除元素?


可能是重复的问题:如何从JavaScript对象中删除属性 - Thomas
2个回答

34

使用delete

delete selectedMap[event.target.id];

你设置的值是错误的,这里是正确的方式:

if(event.target == true){
    var key = event.target.id;   // <== No quotes
    var val = event.target.name; // <== Here either
    selectedMap[key] = val;
}

事实上,您可以:

if(event.target == true){
    selectedMap[event.target.id] = event.target.name;
}

不考虑事件目标的内容,用简单的字符串更容易理解:

var obj = {};
obj.foo = "value of foo";
alert(obj.foo);    // alerts "value of foo" without the quotes
alert(obj["foo"]); // ALSO alerts "value of foo" without the quotes, dotted notation with a literal and bracketed notation with a string are equivalent
delete obj.foo;    // Deletes the `foo` property from the object entirely
delete obj["foo"]; // Also deletes the `foo` property from the object entirely
var x = "foo";
delete obj[x];     // ALSO deeltes the `foo` property

当使用像这样的普通对象时,我总是在键上使用前缀以避免出现问题。(例如,如果您的目标元素的ID是"toString",那么该对象已经有一个名为"toString"的[继承]属性,事情会变得非常奇怪。)

所以对于我来说,我这样做:

if(event.target == true){
    selectedMap["prefix" + event.target.id] = event.target.name;
}

...当然还有:

delete selectedMap["prefix" + event.target.id];

如果您需要进一步了解删除JavaScript对象属性的方法,可以参考以下链接:https://dev59.com/qGw15IYBdhLWcg3wo9Rx - Mrigesh Raj Shrestha
@MrigeshRajShrestha:除了那里被接受的答案是错误的。 - T.J. Crowder
我用splice轻松地拉了它;不知道那里发生了什么事...你有这个问题的jsfiddle吗? - Mrigesh Raj Shrestha
1
@MrigeshRajShrestha:splice 用于处理被分类为数组索引的属性(请参见规范§15.4以了解哪些属性被归类为这种方式)。我不知道你所说的“u got jsfiddle for the issue?”是什么意思。如果你指的是我在接受的答案中指出的错误,请再次查看我的评论;有一个链接到一个jsbin帖子(jsbin类似于jsfiddle),展示了它是如何错误的。 - T.J. Crowder
@TJ Crowder jsfiddle.net 是一个网络应用程序,允许在线存储和执行您的脚本。如果您想让其他人调试您的脚本而不共享整个信息,这是一个很好的选择。去看看那个网站吧,它很棒。 - Mrigesh Raj Shrestha
@MrigeshRajShrestha:我熟悉jsfiddle.net(以及jsbin.com和codepen.io)。那不是让我困惑的部分。请重新阅读评论。 - T.J. Crowder

6
你所拥有的是一个对象而不是一个数组(尽管数组也是一个对象)。你可以使用 {} 声明一个对象文字,而数组文字则是用 [] 声明的。
你可以使用 delete 来移除一个对象属性,像这样:
delete selectedMap[event.target.id];

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