2017-05-04 5 views
2

내가 지속적으로중첩 된 객체 참조에 대한 속기가 있습니까? 중첩 된 객체와 자바 스크립트를 사용하여

const configDoc = Config && Config.Settings && Config.Settings.Group && 
    Config.Settings.Group.theThingIReallyWanted 

같은 물건을하고 중첩 된 참조 것을 얻기위한 속기이 있습니까? 시도의 catch 블록을 사용

+0

하지 언어의 일환으로

function getValue(o, path) { return path.reduce(function (o, k) { return (o || {})[k]; }, o); } var o = { Config: { Settings: { Group: { theThingIReallyWanted: 42 } } } }; console.log(getValue(o, ['Config', 'Settings', 'Group', 'theThingIReallyWanted'])); // 42

, 아니. * 편집 - 내가 잊고있는 새로운 구문 트릭이 없으면. – Pointy

+0

그러나 실제로는 쓰기가 어렵지 않습니다. – Icepickle

+0

그 속성 중 누군가가 존재하지 않으면'undefined'를 반환하겠습니까? 그것이 당신이 얻게 될 것이기 때문입니다. 가능하면 빈 객체를 반환하는 것이 좋을 것입니다 :'return (((Config || {}), Settings || {}) .Group || {}) theThingIReallyWanted || {});' – Chris

답변

1

슬프게도 javascript의 중첩 된 속성에 안전하게 액세스 할 수있는 속기가 없습니다. 그러나 일부 기능 라이브러리는 (다른 유용한 것들과 함께) 문제에 대한 도우미 기능을 제공합니다. 예 (lodash는) :

return _.get(Config, 'Settings.Group.theThingIReallyWanted'); 
+0

나는이 대답을 사용할 것이다. Lodash를 사용하면 필요한 모듈 만 가져올 수도 있습니다. https://www.npmjs.com/package/lodash.get – JoshJoe

1

가 더 속기 없지만 당신이 조건을 체인 피하기 위해 시도 캐치를 사용할 수 AFAIK ...

var test = { a: '', b: { c: {} } } 

try { 
    return test.b.c; 
} catch (e) { 
    return undefined; 
} 

힘내라 :

+0

아마도이 작업을 수행하는 함수를 작성해야합니다. 그리고 나서이를 수행하고 싶을 때 변수로 참조를 전달하십시오. – JoshJoe

+0

u에 대한 try catch를 수행하는 함수? 2-3 라인의 코드를 저장하는 것이 가치가 있다면 - 어쩌면 다른 기능의 catch 블록을 실행하면 다른 것들을 반환하고 싶을 것입니다 - 따라서 여러분에게 달려 있습니다.) – MarcelD

0

은 도움이 될 수 :

try { 
    return Config.Settings.Group.theThingIReallyWanted; 
} catch(e) { 
    // something is undefined 
} 

일부 값이 정의되어 있는지 재귀 적으로 확인하는 쉬운 방법은 없습니다.

+0

이것은 성능에 미친 영향을 미칠 수 있습니다. –

1

모든 것을 끝내고 모든 개체에 확장을 추가 할 수 있습니다. 나는 사람들이 확장 된 객체 기능을 위해 Object 프로토 타입을 사용하여 싫어하는 경향이 있지만이 작업을 수행하는 것보다 쉬운 것은 아무것도 없다는 것을 알고있다. 게다가 이제는 Object.defineProperty 메쏘드 사용이 가능합니다.

if(obj.has("some.deep.nested.object.somewhere")) 

Here's a jsfiddle 그것을 테스트하기 위해, 특히 당신이를 수정하면 나누기 일부 jQuery를 포함

Object.defineProperty(Object.prototype, "has", { value: function(needle) { 
    var obj = this; 
    var needles = needle.split("."); 
    for(var i = 0; i<needles.length; i++) { 
     if(!obj.hasOwnProperty(needles[i])) { 
      return false; 
     } 
     obj = obj[needles[i]]; 
    } 
    return true; 
}}); 

이제 모든 개체의 모든 속성에 대한 테스트하기 위해 당신은 간단하게 할 수있는 Object.prototype은 속성이 열거 가능 해져서 직접적으로 나타납니다. 이것은 타사 라이브러리에서 잘 작동합니다.

+2

나는 네가 여기서 한 짓을 좋아해. 솔직히 말해서 나는 이것을 할 새로운 ES6 ES7의 약자를 기대하고 있었다. 나는 프로토 타입을 사용하는 아이디어에 열중하지 않지만 그것은 아마도 내 자연스러운 성향 일 것이다. – JoshJoe

1

당신은 주어진 키를 반복하고 값 또는 기본값으로 개체 중 하나를 반환 coould. 나중에 마지막 속성을 반환합니다.

+0

나는 어쩌면 이미 어딘가에서 비슷한 대답을 보았다고 느낄 수도있다. :) – Icepickle

+1

@Icepickle, 네 느낌이 맞지만 질문은 가볍게했다. 다른. –