如何从对象中删除属性?

时间:2010-11-14 15:25:33

标签: javascript

目前在checkboxes上设置了一个活动,event.target为我提供了点击的status (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);
}

当我运行此操作时,它会在FirebugselectedMap.remove is not a function

中给出错误

所以我的问题是 如果取消选中该复选框,我该如何删除元素?

2 个答案:

答案 0 :(得分:33)

使用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”的[inherited]属性,并且很快就会非常奇怪。)

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

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

......当然还有:

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

答案 1 :(得分:6)

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

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

delete selectedMap[event.target.id];