2017-11-14 3 views
1

수정할 수없는 API에서받은 JavaScript 객체가 있습니다. 도구 내에서이 데이터를 사용하고 싶지만 도구는 개체의 루트 수준에 저장된 값만 허용합니다. 수준 아래로 키의 값에 액세스하는 데 점 표기법을 사용할 수 없습니다.JavaScript 객체의 부분 평탄화

아래 예제를 기반으로 shape.colour에 액세스 할 수 있지만 대신 새 JSON 객체에서 shape__colour과 같은 내용을 참조 할 수 있습니다.

예부터 객체 :

내가 같이 할 필요 무엇
[{ 
    "id" : 12345, 
    "size" : 40, 
    "shape": { 
    "colour" : 'yellow', 
    "dimension" : '2D' 
    } 
}, 
{ 
    "id" : 12346, 
    "size" : 50, 
    "shape": { 
    "colour" : 'blue', 
    "dimension" : '3D' 
    } 
}] 

: 객체가 내가 건너 한 기능을 평탄화

[{ 
    "id" : 12345, 
    "size" : 40, 
    "shape__colour": 'yellow', 
    "shape__dimension" : '2D;' 
    } 
}, 
{ 
    "id" : 12346, 
    "size" : 50, 
    "shape__colour": 'blue', 
    "shape__dimension" : '3D' 
    } 
}] 

다른 예는 단일 레벨 배열을 생산하는 것 (객체를 모두 삭제하는 것), 개별 객체는 유지해야하지만 객체 내부의 데이터는 한 수준에 있어야합니다.

도움이 될 것입니다.

let result = arr.map(({id, size, shape}) => { 
    return { 
    id, 
    size, 
    shape_colour: shape.colour, 
    shape_dimension: shape.dimension 
    } 
}); 

참고 :

+0

SO는 무료 코드 작성 서비스가 아닙니다. 지금까지 뭐 해봤 어? –

답변

3

또 다른 map 기능 : 당신은 또한 인수 목록에서 모양 객체를 destructure 수 있습니다 :

const result = arr.map( 
    ({shape, ...rest}) => ({ shape__colour: shape.colour, shape__dimension: shape.dimension, ...rest }) 
); 

모양이있는 경우 동적 속성 :

const result = arr.map(
({shape, ...rest}) => Object.assign(rest, ...Object.keys(shape).map(key => {["shape__"+key] : shape[key]})) 
); 
+0

이것은 훌륭합니다. 그리고 내가 필요로하는 최종 목적물에 더 가까워졌습니다. 원래 데이터 세트에는 ID 및 크기와 같은 약 50 개의 다른 "루트"키가 있습니다. 그 (것)들을 통해 루핑하고 명시 적으로 모두 목록으로 만들지 않고 새로운 객체에 추가하는 방법이 있습니까? 당신의 도움에 많은 감사드립니다! – techytuppers

+0

@techytruppers 내 대답을 시도하십시오;) 그것은 이미 (이게'... 휴식'이 다 무슨 뜻인지) –

+0

@techytuppers [try it;] (http://jsbin.com/yuzehetupo/edit)와 같이 이미 작동해야합니다. ? console) –

2

당신은 평탄화 된 형상 특성을 가진 새로운 배열을 반환 map을 사용할 수 있습니다

let result = arr.map(({ 
    id, 
    size, 
    shape: { colour: shape_colour, dimension: shape_dimension } 
}) => { 
    return { 
    id, 
    size, 
    shape_colour, 
    shape_dimension, 
    } 
}); 
+0

필자는 기능에 무엇이 들어 왔는지, 그리고 내가 무엇을 반환하는지 명확히하는 것을 선호합니다. – Andy

+0

시간 내 주셔서 감사합니다. – techytuppers