2013-04-28 5 views
0

자바 스크립트에서 중첩 된 객체를 가져 오거나 설정해야하며, 다음 세터를 작성하고 작동 중입니다. getter에 대한 도움이 필요합니다. 다음 객체가 있다고 말하면서 무엇인가하고 싶습니다.자바 설정 중첩 된 객체에 액세스하기

var prop = get(object, ['complexObj', 'prop1']); 
set(object, ['complexObj', 'prop1'], 'newValue'); 
var object = { 
    complexObj: { 
     'prop1': 'A' 
     'prop2': 'B'}, 
    'prop3': 'C' 
}; 

// helper function 
var read = function(obj, prop) 
{ 
    if ((obj != null ? obj[prop] : void 0) == null) 
    { 
     return; 
    } 
    return obj[prop]; 
}; 
// The following methods allow contextManager data to be accessed either via array of property name parts like ['complexObj', 'subObj', 'subProp1'] 
var get = function (props) { 
    var current = properties; 
    var val; 
    for (var i = 0; i < props.length; i++) { 
     if (val = read(current, props[i])) { 
      current = val; 
     } else { 
      return ''; 
     } 
    } 
    return current; 
}; 

JQuery와/lodash 또는 다른 라이브러리를 사용하여 할 수있는 방법 대신 객체의 내부 루핑이 있다면 내가 방황처럼? 또한 세터와 약간의 도움이 필요합니다.

+2

코드를 들여 쓰기 좋게 주시겠습니까? 필요한 경우 http://jsbeautifier.org를 사용하십시오. –

+0

... 너 들여 쓰기 좀 할까? 그리고 이것이 무엇을하기로되어 있는지 조금 더 명확하게 설명하십시오. – Ryan

+3

왜'object.complexObj.prop1 = "newvalue"'를 할 수 없습니까? – Bart

답변

0

시도

var object = { 
    complexObj: { 
     'prop1': 'A', 
     'prop2': 'B' 
    }, 
    'prop3': 'C' 
}; 

// helper function 
var read = function(obj, prop) { 
    return obj ? obj[prop] : undefined; 
}; 
// The following methods allow contextManager data to be accessed either via array of property name parts like ['complexObj', 'subObj', 'subProp1'] 
var get = function (properties, props) { 
    var current = properties; 
    var val; 
    for (var i = 0; i < props.length; i++) { 
     if (val = read(current, props[i])) { 
      current = val; 
     } else { 
      return undefined; 
     } 
    } 
    return current; 
}; 
console.log(get(object, ['complexObj', 'prop1'])); 
//set(object, ['complexObj', 'prop1'], 'newValue'); 
console.log(get(object, ['complexObj', 'prop1'])); 

데모 : Fiddle

있다가 정의되기 전에 우리는 get를 호출 당신과 같은 몇 가지 실수를했다, 당신은 첫 번째 매개 변수로 objectget에 방법을 통과해야

+0

아마도'' ''대신'undefined'를 반환해야합니다. –

+0

@ gion_13 예. –

0
// get a property 
var get = function(obj, accessor) { 
    for (var i = 0, len = accessor.length; i < len; i++) { 
     if (!obj) return ""; 
     obj = obj[accessor[i]]; 
    } 

    return obj; 
}; 

// set a property 
var set = function(obj, accessor, value) { 
    for (var i = 0, len = accessor.length - 1; i < len; i++) { 
     if (!obj) obj = {}; 
     obj = obj[accessor[i]] = obj[accessor[i]] || {}; 
    } 

    obj[accessor[i]] = value; 
}; 

// example 
var object = { 
    a: 2, 
    b: { 
     c: 1 
    } 
}; 

get(object, ["b", "c"]); // 1 
set(object, ["d"], 3); // { a: 2, b: { c: 1 }, d: 3 } 
set(object, ["e", "f"], 4); // { ..., e: { f: 4 } } 

/* 
object == { 
    a: 2, 
    b: { 
     c: 1 
    }, 
    d: 3, 
    e: { 
     f: 4 
    } 
} 
*/ 

이 코드는 거기에없는 속성을 설정할 때 자동으로 새 개체를 만듭니다.

관련 문제