2016-12-11 1 views
0

두 개의 범주가 각각 포함 된 개체 배열이 있으며이 범주 중 하나는 그룹을 나타냅니다.필드로 개체 배열 필터링

[ 
    { 
    "uuid": 123, 
    "group": "test_group" 
    }, 
    { 
    "uuid": 321, 
    "group": "test_group" 
    }, 
    { 
    "uuid": 432, 
    "group": "test_group2" 
    } 
] 

그룹별로 분류 한 JSON 응답을 생성하려고합니다.

{ 
    "objects": [ 
    { 
     "group": "test_group", 
     "items": [ 
     { 
      "uuid": 123 
     }, 
     { 
      "uuid": 321 
     } 
     ] 
    }, 
    { 
     "group": "test_group2", 
     "items": [ 
     { 
      "uuid": 432 
     } 
     ] 
    } 
    ] 
} 

순간에 나는 처음에 걸쳐 반복과 관련된 모든 그룹의 집합을 생성하고 반복하는 다시 적절하게 그룹화하여이 작업을 수행했습니다. ES6에서 소개 된 새로운 연산자 중 일부를 사용하여이 작업을 수행하는 좀 더 간결한 방법이 있는지 궁금합니다.

+4

이러한 종류의 데이터 재 형성을 위해 ES6에는 특별한 것이 없습니다. 당신은 ES5 솔루션을 사용하여 화살표 함수, 퍼짐 연산자, 해체 및 어쩌면'Array # find' 메소드를 사용하여보다 간결하고 읽기 쉽게 만들 수 있습니다. –

+0

이 질문은 너무 광범위합니다.이 작업은 여러 가지 방법으로 수행 할 수 있기 때문입니다. 혼자서 해결책을 찾고, 특정 문제가 발생하면 물어보십시오. –

+0

내가 해결책을 가지고 있다고 언급하면서 누군가 다른 것을 가지고 있는지 알아보기 위해 여기에서 묻고 있었다. – FredLoh

답변

3

Array#reduce을 사용하여 반복하고 그룹별로 항목을 Map으로 수집하십시오. 배열에 다시 Map#values 변환 확산 사용하여 새로운 운영자 또는이 쉽게 ES6에 도입하게 배열 기능이의

const data = [ 
 
    { 
 
    "uuid": 123, 
 
    "group": "test_group" 
 
    }, 
 
    { 
 
    "uuid": 321, 
 
    "group": "test_group" 
 
    }, 
 
    { 
 
    "uuid": 432, 
 
    "group": "test_group2" 
 
    } 
 
]; 
 

 
const result = [...data.reduce((hash, { uuid, group }) => { 
 
    const current = hash.get(group) || { group, items: [] }; 
 
    
 
    current.items.push({ uuid }); 
 
    
 
    return hash.set(group, current); 
 
}, new Map).values()]; 
 

 
console.log(result);

+0

의도적으로'new map'에 대한 괄호를 생략 했습니까? 또한, 반복 구문을 대신하여'Array.from()'을 사용하여 반복 가능한 객체를 배열로 변환하는 것이 더 바람직하다고 생각합니다. 왜냐하면이 방법이 더 명백하기 때문입니다. –

+0

물론. 그들은 [옵션] (http://stackoverflow.com/a/3034952/5157454)입니다. 나는'Array.from()'을 좋아하지만, 퍼짐으로 배열을 볼 수 있기 때문에 좀 더 명확한 것이 확실치 않습니다. –

+0

@OriDrori 끝에 새지도가 나오는 이유는 무엇입니까? 나는 그 시점까지 따라하고 나서 길을 잃는다. 필요한 이유는 무엇입니까? – FredLoh

0

나는 그러나 당신이 할 수 몰라