关于javascript:如何从对象中删除属性?

How to remove a property from an object?

当前在checkboxes上设置了一个事件,event.target给了我单击的status (checked = true/false)复选框。

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

1
2
3
4
5
6
7
var selectedMap  = {};

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

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

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

当我运行它时,它在Firebug中给了我错误:selectedMap.remove is not a function

所以我的问题是,当复选框未被选中时,如何删除元素?


使用delete

1
delete selectedMap[event.target.id];

不过,您设置的值不正确。以下是正确的方法:

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

事实上,你可以:

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

将事件目标的内容排除在外,使用简单的字符串可以更容易地预见到这一点:

1
2
3
4
5
6
7
8
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"的[继承]属性,事情很快就会变得非常奇怪。)

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

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

…当然:

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


您拥有的是一个对象而不是一个数组(尽管数组是一个对象)。使用{}声明对象文本,而数组文本使用[]声明。

可以使用delete删除这样的对象属性

1
delete selectedMap[event.target.id];