如何从哈希中删除所有元素并保留引用

时间:2013-03-23 20:47:28

标签: javascript

我需要从散列/对象中删除所有内容并保留引用。 这是一个例子

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 ;

有什么建议吗?

3 个答案:

答案 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 = {}会更好。