2012-01-08 22 views
6

オブジェクトの特定のメンバーを削除したいと思います(引数のために、キーが '_'で始まるもの)。これを行うためのエレガントな方法は何ですか?純粋な方法は次のようになります。オブジェクトのメンバーを除外するための良いイディオム(JavaScript)

for (var i in obj) 
    if (i[0] === '_') 
    delete obj[i]; 

しかし、それは反復中に基礎となるオブジェクトを変更します。ノードでは、少なくとも私は、毎回何かが厄介なネストされたループを削除しています。私は

Object.keys(obj).forEach(function (i) { if (i[0] === '_') delete obj[i]; }); 

または反復を再起動できたと思います

もっと良い解決策はありますか?

EDIT:ちょうど今、node.jsのテストでは、少なくとも純粋な解決法が機能しているようです。確実に実装する必要があるのは確かです。誰でも知っていますか?

+3

for for ... inループ中にオブジェクトを変更すると問題が発生しますか?結局のところ、 'forEach()'コールバックでオブジェクトを変更するのとはどう違うのか分かりません。 – Pointy

+0

私は、 'Object.keys'がオブジェクトのキーのスナップショットを取ると仮定しています。たぶんそれは真実ではないでしょう。 – Grumdrig

+0

... 'for(... in ...)'がオブジェクトのスナップショットを取っていないと仮定します。 – Grumdrig

答えて

17

あなたは気にする必要はありません。 ECMAScript Language Specification§12.6.4のための抜粋は、明示的に(私が強調した)状態:

力学とプロパティを列挙の順番( 最初のアルゴリズムのステップ6.A、第二のステップ7.A)されます指定されていない。 列挙中のオブジェクトのプロパティは、列挙中に削除されることがあります。 列挙中にまだ訪問されていないプロパティが削除された場合、それは訪問されません。 列挙中に列挙されているオブジェクトに新しい プロパティが追加された場合、新しく追加されたプロパティは、アクティブな列挙でアクセスされた であるとは限りません。任意の列挙でプロパティ名を複数回訪問することは避けてください。

+0

-1 - "列挙中にまだ訪れていないプロパティの場合" - ここには該当しないと思います。 – thejh

+0

@thejhの場合、先行する文が適用されます。 'for..in'は、標準に従ってプロパティの削除に対して完全に安全です。 – OnTheFly

+1

完全に偽のdownvoteで+1良い答え –

4

理由はしかし、ループ中にオブジェクトを変更します

var l = []; 
for (var i in obj) 
    if (i[0] === '_') 
    l.push(i); 
l.forEach(function(v){ delete obj[v]; }); 
4
Object.keys(obj).filter(function (v) { 
    return v[0] === "_"; 
}).forEach(function (v) { 
    delete obj[v]; 
}); 

のように削除する名前のリストを作成しないで、あなたはジェネリック度もこの多くを使用した場合のp

です:

Object.keys(obj).filter(function (v) { 
    //filter the object values/keys by some conditions 
}).forEach(del.bind(obj)); 

function del (v) { 
    delete this[v]; 
} 
+0

ありがとうございました。 'filter'について知りませんでした。 – Grumdrig

2

フィルタリングされたオブジェクトを返す関数を作成する方法もあります。私は、修正されているオブジェクトへの参照を保持するコードの他の部分への副作用を避けるために、この解決策を好むでしょう。

function filterObject(obj) { 
    var filtered = new Object(); 
    for (var i in obj) 
    if (i[0] != '_') 
     filtered[i] = obj[i]; 
    return filtered; 
} 
関連する問題