2012-03-04 7 views
2
var params = { 
    search: { 
     make: "", 
     model: "" 
    } 
} 

function setVariable() { 
    var value = "BMW"; 
    var key = "search.make"; 
    var arr = key.split("."); //eg. ["search", "make"] 
    params[arr[0]][arr[1]] = value; // this works, but how do you 
             // do it with unknown arr[] length? 
} 

これは未知のarr[]の長さでどうしますか?javascriptのオブジェクト内のプロパティの値を未知の深さに設定します

私はおそらく、再帰呼び出しを行う必要があると推測しているかもしれません。関数内にarr.slice(1)のようなものを渡していたかもしれませんが、どのように見えるのか分かりませんでした。

+2

'search 'が存在しない場合はどうなりますか?オブジェクト '{make:value}'を作成し、それを 'params.search'に代入しますか?または、* existing *プロパティの値を設定できるだけでいいのですか? –

答えて

2
var params = { 
    search: { 
     make: "", 
     model: "", 
     whatever: { 
      foo: { 
       bar: { 
        moo: 123, 
        meow: 'xyz' 
       } 
      } 
     } 
    } 
}; 

function updatePath(obj, path, value) { 
    var parts = path.split('.'); 
    var i, tmp; 
    for(i = 0; i < parts.length; i++) { 
     tmp = obj[parts[i]]; 
     if(value !== undefined && i == parts.length - 1) { 
      tmp = obj[parts[i]] = value; 
     } 
     else if(tmp === undefined) { 
      tmp = obj[parts[i]] = {}; 
     } 
     obj = tmp; 
    } 
    return obj; 
} 

デモ配置する必要があります:。。

を0
> updatePath(params, 'search.whatever.foo.bar') 
{ moo: 123, meow: 'xyz' } 
> updatePath(params, 'search.whatever.foo.bar.moo') 
123 
> updatePath(params, 'search.whatever.foo.bar.moo', 'test') 
'test' 
> updatePath(params, 'search.whatever.foo.bar.moo') 
'test' 
> updatePath(params, 'search.whatever.foo.bar') 
{ moo: 'test', meow: 'xyz' } 
> updatePath(params, 'search.whatever.foo.bar.x.y.z', 'hi') 
'hi' 
> updatePath(params, 'search.whatever.foo.bar.x') 
{ y: { z: 'hi' } } 
> updatePath(params, 'search.whatever.foo.bar') 
{ moo: 'test', 
    meow: 'xyz', 
    x: { y: { z: 'hi' } } } 
> 
2

次のコードは、指定されたキーが見つかるまでparamsオブジェクトを走査します。それはkey.split(".")キーの適切な配列(あなたがここにさらにあなたの入力をサニタイズする必要があるかもしれませんが返されることを前提としてい

var params = { 
    search: { 
     make: "", 
     model: "" 
    } 
} 

function setVariable() { 
    var value = "BMW"; 
    var key = "search.make"; 
    var arr = key.split("."); //eg. ["search", "make"] 

    var runner = params; 
    for(var i=0, max=arr.length-1; i<max; ++i) { 
     // make sure the key exists 
     runner[ arr[i] ] = runner[ arr[i] ] || {}; 
     // move one level deeper 
     runner = runner[ arr[i] ]; 
    } 

    // set the value in the last level 
    runner[ arr[arr.length-1] ] = value; 
} 

EDIT:フェリックスクリングのコメントに WRT:それはあなたが以前にexistantないキーが欲しいことを前提としてい生成されるそうで、あなたがAAキーが存在しない場合は、さらに代わりにそれを作成するので、forループにチェックして、機能を残す

+0

元の 'params'変数ではなく' runner'変数の値を設定しませんか? – alnafie

+1

常にobオブジェクトを扱うので、 'runner'と' params'は常に同じオブジェクトまたはその一部を指しています。 'runner = 3;'のような式はこの接続を壊しますが、オブジェクトに新しいキーを追加することはできません。したがって、上記のスクリプトは元のオブジェクトに値を追加する必要があります。 [タイポを修正する] – Sirko