如何从对象中删除属性?

Rac*_*hel 18 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;
}
Run Code Online (Sandbox Code Playgroud)

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

else if(event.target == false){
  selectedMap.remove(event.target.id);
}
Run Code Online (Sandbox Code Playgroud)

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

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

T.J*_*der 33

使用delete:

delete selectedMap[event.target.id];
Run Code Online (Sandbox Code Playgroud)

但是,您正在设置错误的值.这是正确的方法:

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

事实上,你可以:

if(event.target == true){
    selectedMap[event.target.id] = event.target.name;
}
Run Code Online (Sandbox Code Playgroud)

将事件目标放在一边,用简单的字符串来设想它更容易:

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
Run Code Online (Sandbox Code Playgroud)

当使用像这样的普通对象时,我总是在我的键上使用前缀来避免问题.(例如,如果您的目标元素的ID是"toString"会发生什么?该对象已经有一个名为"toString"的[inherited]属性,并且很快就会非常奇怪.)

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

if(event.target == true){
    selectedMap["prefix" + event.target.id] = event.target.name;
}
Run Code Online (Sandbox Code Playgroud)

...而且当然:

delete selectedMap["prefix" + event.target.id];
Run Code Online (Sandbox Code Playgroud)


Rus*_*Cam 6

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

您可以使用它delete来删除对象属性

delete selectedMap[event.target.id];
Run Code Online (Sandbox Code Playgroud)