4

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

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 ;

有什么建议么?

4

3 回答 3

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();

这是它的垫片,因此您可以在当前的浏览器中使用它。

于 2013-03-23T21:03:09.637 回答
1

这不起作用:

var i ;
for( i in items; i++; ) {
   delete items[i] ;
}

它使用 init 代码创建了一个for 循环i in items(顺便说一句,false由于 没有"undefined"key in items,但这并不重要),以及条件i++和没有更新代码。然而i++评估为 falsy NaN,因此您的循环将立即中断。如果没有第二个分号,它甚至是一个 SyntaxError。

相反,您需要一个for-in-loop

for (var i in items) {
    delete items[i];
}

顺便说一句,items.clean = true;将再次创建一个新属性,因此该对象不会真正“干净”:-)

我想知道是否有更短的方法来实现这一点。例如,可以按如下方式清理数组

不,您必须循环所有属性并删除它们。

于 2013-03-23T21:14:36.923 回答
0

没有更短的方法,抱歉。你的循环不应该有这个i++

function removeItems(items) {
  for(var i in items) {
    delete items[i];
  }

  items.clean = true;
}

重构你的代码并只是做x.items = {}会更好。

于 2013-03-23T20:51:07.553 回答