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 マップを使用した代替ソリューションを次に示します。

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

現在のブラウザーで使用できるようにするための shim を次に示します。

于 2013-03-23T21:03:09.637 に答える
1

これは動作しません:

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

これは、init コード(これは btw にキーがないと評価されますが、それは重要ではありません)、および条件と更新コードなしでfor ループを作成します。まだfalsyに評価されるため、ループはすぐに壊れます。2 番目のセミコロンがないと、SyntaxError になります。i in itemsfalse"undefined"itemsi++i++NaN

代わりに、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 に答える