2010-03-23 6 views
1

JavaScript 개체 트리가 다음과 같은 방식으로 PHP 연관 배열처럼 동작하려고합니다.어떻게 자바 스크립트에서 변수 속성을 사용하여 개체 트리에서 값을 선언 할 수 있습니까?

var key1 = 'a'; 
var key2 = 'b'; 
var key3 = 'c'; 

var obj[key1][key2][key3] = 'd'; 

그러나 javascript에서는 개별 속성/개체 쌍을 개별적으로 정의하여 더 깊은 잎을 형성해야한다고 생각합니다. 다음과 같이하십시오 :

var obj[key1] = {}; 
var obj[key1][key2] = {}; 
... 

이 스크립트를 단순화하거나 축소 할 수있는 방법이 있습니까?

감사

답변

1

그것을 할 수있는 "자연"방법이 있는지 모르겠어요,하지만 당신은 그것을 할 수 이 같은 :

function phpLike(){}; 
phpLike.prototype.set = function() 
{ 
    var l = arguments.length; 
    if (l<2) return; 
    var o = this; 
    for (var i=0; i<l-2; i++) 
    { 
     if (o[arguments[i]] === undefined) o[arguments[i]] = {}; 
     o = o[arguments[i]]; 
    } 
    o[arguments[l-2]] = arguments[l-1]; 
} 

// Test 
var key1 = 'a'; 
var key2 = 'b'; 
var key3 = 'c'; 
var obj = new phpLike(); 
obj.set(key1, key2, key3, 'd'); 
alert(obj[key1][key2][key3]); 
-1
var obj = { key1: { key2: { key3: 'd' } } } 

이 구문은 JSON으로 알려진 형식의 기초 : http://en.wikipedia.org/wiki/JSON

+1

키 1이 예에서 속성 이름으로 볼 것 없다 '는' – joshs

+0

내 실수를 참조 변수, 내가 질문을 오해 "키 1"이 문자 키 이름이 있어야했다 생각했다. – Will

0

하지 직접적으로, 지금까지의 내가 아는 한,하지만 어떻게 작은 도우미 함수를 사용하는 방법에 대한?

function kv1(k, v) { 
    var o = { }; 
    o[k] = v; 
    return o; 
} 

var obj = kv1(key1, kv1(key2, kv1(key3, 'd'))); 
+0

이전에 설정된 키를 새로운 키로 제거하지 않습니까? – Plynx

+0

그래,하지만 깊이있는 중첩 된 개체를 하나만 만들어야 할 필요가 있다고 생각했는데 이후에는 필요에 따라 확장 할 수있었습니다. – Sean

+0

키를 보존해야합니다. – joshs

0

방금 ​​윌의 게시물에서 영감을 얻은 답변을 생각했습니다. json 문자열을 만든 다음 eval()을 생성했습니다.

var obj = eval("{" + key1 + ": {... }};"); 

이런 종류의 개체 검색은 개체 트리 및 딥 리프를 선언하는보다 간결한 방법을 제공합니다. 그러나, 그것은 추악하고, 혼란스럽고 나는 전염병처럼 그것을 피할 것입니다.

+0

그런 식으로 결정하면 좋은 string.format 프로토 타입을 사용하여 모든 못생긴 연결을 제거 할 수 있습니다. 또한 안전을 위해 eval 대신 JSON.parse (많은 최신 브라우저에 내장되어 있음)를 사용하는 것을 고려하십시오. 덕분에 – Plynx

1
function setPropertyByKeyPath(obj, path, val) { 
    var key; 
    while (path.length > 1) { 
     key = path.shift(); 
     obj[key] = typeof obj[key] === "object" ? obj[key] : {}; 
     obj = obj[key]; 
    } 
    obj[path.shift()] = val; 
} 

var o = {}; 
setPropertyByKeyPath(o, ['foo', 'bar'], 5); 
alert(o.foo.bar) 
+0

. 좋은 해결책이기도하다. – joshs

관련 문제