2

タイトルは申し訳ありませんが、それを説明する方法がわかりません。

この関数は URI を取ります (例: /foo/bar/1293)。オブジェクトが存在する場合は、{foo: { bar: { 1293: 'content...' }}} のようなオブジェクトに格納されます。この関数は、URI のディレクトリを反復処理し、パスが未定義でないことを確認し、その間に、後で eval() を使用して呼び出されるコードで文字列を作成します。コードを含む文字列は、delete memory["foo"]["bar"]["1293"]のようになります。

これを達成できる他の方法はありますか?保存されたコンテンツを通常のオブジェクト以外に保存することはできますか?

remove : function(uri) {
        if(uri == '/') {
            this.flush();
            return true;
        }        
        else {
            var parts = trimSlashes(uri).split('/'),
                memRef = memory,
                found = true,
                evalCode = 'delete memory';

            parts.forEach(function(dir, i) {
                if( memRef[dir] !== undefined ) {
                    memRef = memRef[dir];
                    evalCode += '["'+dir+'"]';
                }
                else {
                    found = false;
                    return false;    
                }

                if(i == (parts.length - 1)) {
                    try {
                        eval( evalCode ); 
                    } catch(e) {
                        console.log(e);
                        found = false;
                    }
                }
            });

            return found;
        }        
    }
4

2 に答える 2

1

Arrayとオブジェクトを取り、次のことを行うヘルパー関数が必要です。

function delete_helper(obj, path) {
  for(var i = 0, l=path.length-1; i<l; i++) {
    obj = obj[path[i]];
  }
  delete obj[path.length-1];
}

コード文字列を構築する代わりに、名前を に追加し、 のArray代わりにこれを呼び出しますeval。このコードは、パスが存在するかどうかのチェックが既に行われていることを前提としています。

于 2012-10-23T14:47:36.680 に答える
1

ここで評価する必要はありません。あなたのようにドリルダウンして、最後にプロパティを削除してください:

parts.forEach(function(dir, i) {
    if( memRef[dir] !== undefined ) {
        if(i == (parts.length - 1)) {
            // delete it on the last iteration
            delete memRef[dir];
        } else {
            // drill down
            memRef = memRef[dir];
        }
    } else {
        found = false;
        return false;
    }
});
于 2012-10-23T14:45:10.890 に答える