我需要从散列/对象中删除所有内容并保留引用。 这是一个例子
var x = { items: { a: 1, b: 2} }
removeItems(x.items) ;
console.log(x.items.clean) ;
function removeItems(items) {
var i ;
for( i in items; i++ ) {
delete items[i] ;
}
items.clean = true ;
}
我想知道是否有更短的方法来实现这一目标。例如,清理阵列可以按如下方式完成
myArray.length = 0 ;
有什么建议吗?
答案 0 :(得分:8)
目前没有简单的方法可以做到这一点,但是ECMAScript委员会看到了这种需求,并且它符合下一版JS的当前规范。
以下是另一种解决方案,使用ECMAScript 6 maps:
var x = {}
x.items = new Map();
x.items.set("a",1);
x.items.set("b",2);
//when you want to remove all the items
x.items.clear();
Here is a shim for it因此您可以在当前的浏览器中使用它。
答案 1 :(得分:1)
这不起作用:
var i ;
for( i in items; i++; ) {
delete items[i] ;
}
它使用初始化代码i in items
创建for-loop(由于false
中没有"undefined"
键,因此btw评估为items
,但这不是无所谓),条件i++
,没有更新代码。然而i++
评估为假NaN
,所以你的循环会立即中断。没有第二个分号,它甚至可以作为SyntaxError。
相反,您需要for-in-loop:
for (var i in items) {
delete items[i];
}
顺便说一句,items.clean = true;
会再次创建一个新属性,因此该对象不会真正“干净”: - )
我想知道是否有更短的方法来实现这一目标。例如,清理阵列可以按如下方式完成
没有。您必须循环所有属性并将其删除。
答案 2 :(得分:0)
没有更短的路,对不起。你的循环不应该有i++
。
function removeItems(items) {
for(var i in items) {
delete items[i];
}
items.clean = true;
}
重新构建代码,只是做x.items = {}
会更好。