2012-03-04 2 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'에 할당하겠습니까? 아니면 기존 * 속성의 값만 설정할 수 있기를 원하십니까? –

답변

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; 
} 

편집 :. 펠릭스 클링의 의견에 WRT : 그것은 당신이 이전에 존재하지 않는하지 키를 원하는 것으로 가정 . 생성 할 다른 사람은 키가 존재하지 않는 경우 AA 더 대신을 만드는,는 for 루프에 확인하고 기능을 중단 넣어야 할 것

+0

원래'params' 변수가 아닌'runner' 변수의 값을 설정하지 않습니까? – alnafie

+1

항상 ob 객체를 사용하기 때문에 runner와 params는 항상 같은 객체 또는 그 일부를 가리 킵니다. 'runner = 3; '과 같은 표현식은이 연결을 끊지 만 객체에 새로운 키를 추가하는 것은 그렇지 않습니다. 따라서 위의 스크립트는 원래 개체에 값을 추가해야합니다. [오타도 수정하다] – Sirko

관련 문제