如何从散列中删除所有元素并保留引用

How to remove all elements from hash and keep the reference

本文关键字:元素 保留 引用 删除      更新时间:2023-09-26

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

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 ;

有什么建议吗?

目前还没有简单的方法来做到这一点,但是ECMAScript委员会看到了这个需求,并且在下一个JS版本的当前规范中有。

这里有一个替代的解决方案,使用ECMAScript 6映射:

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

这行不通:

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

它创建了一个for循环,初始代码i in items(它的计算结果为false,因为items中没有"undefined"键,但这无关紧要),条件i++,没有更新代码。然而i++的计算结果是假的NaN,因此循环将立即中断。如果没有第二个分号,它甚至作为SyntaxError。

相反,您需要for-in-loop:
for (var i in items) {
    delete items[i];
}

顺便说一句,items.clean = true;会再次创建一个新属性,所以对象不会真正"干净":-)

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

。你必须循环所有的属性并删除它们

对不起,没有更近的路了。你的循环不应该有i++

function removeItems(items) {
  for(var i in items) {
    delete items[i];
  }
  items.clean = true;
}

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