2012-11-21 17 views
7

Javascriptオブジェクトに自動ウイルス対策を使用するために、ネイティブまたはライブラリを使用していますか?Javascriptオブジェクトで自動ウイルス対策をサポートするライブラリはありますか?

IEの場合、fooは、プロパティを持たないオブジェクトであり、foo.bar = {}; foo.bar.baz = 5を必要とせずにfoo.bar.baz = 5を実行するだけです。

+4

純粋にネイティブに、私はそう思わない。 'undefined'は拡張可能でも変更可能でもなく、関数を渡さずに行うことができる唯一の方法です。 – Snuffleupagus

+2

いいえhttp://stackoverflow.com/questions/7691395/autovivification-and-javascript – lbstr

+0

@Ibstr、その質問は、自動ウイルス対策とJavaScriptを参照しながら、同じことを私に尋ねていません。 –

答えて

5

あなたが望む構文で正確に行うことはできません。しかし、いつものように、JSに独自の関数を書くことができます。barbazが定義されている場合は気にせず

// as per you example: 
set(foo,['bar','baz'],5); 

function set (obj,keys,val) { 
    for (var i=0;i<keys.length;i++) { 
     var k = keys[i]; 
     if (typeof obj[k] == 'undefined') { 
      obj[k] = {}; 
     } 
     obj = obj[k]; 
    } 
    obj = val; 
} 

は今、あなたはこれを行うことができます。ファンクションコールで[..]が好きでない場合は、いつでもargumentsオブジェクトを反復処理できます。

+0

私はset( 'dict_obj'、[0、 'User']、5)のような辞書の値を設定しています。しかし、私は "Console.log( 'dict_obj [0] [' User '])のような呼び出しを使用して設定した値を返すことはできません。値5を返すことはできません。 – ouonomos

+0

@ouonomos:あなたは間違っている、あなたは 'dict_obj'という文字列の代わりに' dict_obj'という文字列に値を設定しています。 – slebetman

+0

私は誤解しました。私が実際にやっているのは:\t \t \t \t lastposxns = {}; \t \t \t \t grpname = 0; \t \t \t \t tempname = 'abc'; \t \t \t \t ypos = 5; \t \t \t dict_set(lastposxns [grp、tempname]、ypos);ここで、dict_setはautoviv関数です。しかし、console.log(lastposxns [0] ['abc'])は値5を返しません。 – ouonomos

2

純粋にネイティブに、私はそうは思わない。 undefinedは拡張可能でも変更可能でもなく、関数を渡さずにそれをやっていると想像できる唯一の方法です。

0

また、評価ベースのソリューションを使用することもできます。醜いですが、推薦されません。

function av(xpr) { 

    var res = ""; 
    var pos = 0; 
    while (true) { 

     var pos = xpr.indexOf("[",pos); 
     if (pos == -1) break; 
     var frag = xpr.substr(0,pos); 
     pos++; 

     res += "if (typeof(" + frag + ") != 'object') " + frag + " = {};\n"; 
    } // while 

    return res + xpr; 
} // av() 


function main() { 

    var a = {}; 
    a["keep"] = "yep"; 
    eval(av('a[1][1]["xx"] = "a11xx"; ')); 
    eval(av('a[1][2]["xx"] = "a12xx"; ')); 

    console.log(a); 
} // main() 
2

私はこれをしたいと望んでいたので、私はa package to handle itを書きました。

% npm install autovivify 
% node 
> Av = require('autovivify') 
> foo = new Av() 
{} 
> foo.bar.baz = 5 
5 
> foo 
{ bar: { baz: 5 } } 
> 

それも、数値の添字で配列をやる:slebetmanのコード@

> foo = new Av() 
> foo.bar.baz[0] = 'hum' 
> foo 
{ bar: { baz: [ 'hum' ] } } 
0

が動作するようには思えません。最後のキーには空のオブジェクトを割り当てるべきではなく、valを割り当てます。このコードは働いた:

function autoviv(obj,keys,val) { 
    for (var i=0; i < keys.length; i++) { 
    var k = keys[i]; 
    if (typeof obj[k] === 'undefined') { 
     if(i === keys.length-1) { 
     obj[k] = val; 
     return; 
     } 
     obj[k] = {}; 
    } 
    obj = obj[k]; 
    } 
} 

foo = {} 
autoviv(foo,['bar','baz'],5); 
console.log(foo.bar.baz); 
5 
+0

こんにちはマーク、疑問があります。角度jを使ってスクリーンショットをキャプチャする良い方法はありますか?はい、これを確認してください。https://stackoverflow.com/questions/44602309/making-a-スクリーンを使用した適切な画像取得jquery –

関連する問題