2012-10-08 3 views
1

JSON 입력 데이터에서 해당 그룹의 하위를 포함하여 특정 그룹에 속한 데이터를 반환하는 자바 스크립트에서 함수를 작성하려고합니다. 데이터는 다음과 같습니다.JSON 데이터를 그룹화하는 함수

  [ 
      {"id":"0", "name":"Person 0"}, 
      {"id":"1", "name":"Person 1","group":"0"}, 
      {"id":"2", "name":"Person 2","group":"0"}, 
      {"id":"3", "name":"Person 3","group":"2"}, 
      {"id":"4", "name":"Person 4","group":"2"}, 
      {"id":"5", "name":"Person 5","group":"4"}, 
      {"id":"6", "name":"Person 6","group":"4"}, 
      {"id":"7", "name":"Person 7","group":"0"}, 
      {"id":"8", "name":"Person 8","group":"7"} 
      ] 

여기에서 그룹 x의 사람은 ID가 x 인 사람과 같은 그룹에 속합니다.

예 : 기능 (데이터 그룹) 함수에 대한 다음의 반환 (데이터, 2)

  [ 
      {"id":"3", "name":"Person 3","group":"2"}, 
      {"id":"4", "name":"Person 4","group":"2"}, 
      {"id":"5", "name":"Person 5","group":"2"}, 
      {"id":"6", "name":"Person 6","group":"2"}, 
      ] 

및 기능 (데이터 0)

  [ 
      {"id":"1", "name":"Person 1","group":"1"}, 
      {"id":"2", "name":"Person 2","group":"2"}, 
      {"id":"3", "name":"Person 3","group":"2"}, 
      {"id":"4", "name":"Person 4","group":"2"}, 
      {"id":"5", "name":"Person 5","group":"2"}, 
      {"id":"6", "name":"Person 6","group":"2"}, 
      {"id":"7", "name":"Person 7","group":"7"}, 
      {"id":"8", "name":"Person 8","group":"7"} 
      ] 

I는 시도 배열을 반복하지만 하위 그룹을 다루지는 않습니다. 그래서 재귀 적으로해야합니다.

+0

당신은뿐만 아니라 하위 그룹을 처리하지 않는 당신의 예에 --- "하지만이 하위 그룹과 거래를하지 않습니다." – zerkms

+0

@zerkms 예. 하위 그룹은 ID –

+1

@ Rob W : 2 개의 예 중 재귀 실행이 있습니까? – zerkms

답변

2

하여 데이터 배열 .reduce() 서브 그룹에 연결할 수있다.

function dataForGroup(data, group, refs) { 
    if (!refs) 
     refs = {}; 

     // check if it's in the list 
    if (refs[group] === true) 
     return []; // or you can throw an Error 
    else 
     refs[group] = true; // first encounter, so add it to the list 

    return data.reduce(function(res, obj) { 
     return obj.group == group ? 
        res.concat(obj, dataForGroup(data, obj.id, refs)) : res; 
    }, []); 
} 

순환 참조가 없기를 바랍니다.

group(data, 0) 출력을 이해할 수 없지만 하위 그룹 데이터가 표시되지 않습니다.

+0

감사합니다. 그러나 오류가 발생합니다. Uncaught RangeError : 일부 그룹에 대해 최대 호출 스택 크기를 초과했습니다 (예 : 2. – graphmeter

+0

@graphmeter : 그룹 2에서는 얻을 수 없습니다. http://jsfiddle.net/Kt7Ce/하지만 순환 참조를 관찰해야합니다. –

+0

이제 작업하게되었습니다. 순환 참조를 찾는 좋은 방법은 무엇입니까? – graphmeter

1

전체 데이터 배열을 반복하고 같은 그룹의 항목을 필터링합니다.

var newArr = [], 
    isVisted = []; // using to prevent circular reference. 

function getGroup(data, groupId, inside) { 
    if (!inside) { 
     newArr = []; 
     isVisted = []; 
    } 
    if (isVisted.indexOf(groupId) !== -1) { 
     return 
    }; 
    for (var k = 0; k < data.length; k++) { 
     if (data[k].group == groupId) { 
      newArr.push(data[k]) 
      getGroup(data, data[k].id, true); 
     } 
    } 

    return newArr; 
} 

jsfiddle demo

+0

작동하지 않습니다. 이 문제를 해결하려면 재귀가 필요합니다. –

+0

@Shusi OP의 예는 그룹 ID 매핑이 동적임을 보여주기 때문입니다. –

+0

@Shusi 질문에 더 가까워지고 아래의 설명에있는 토론을 보면 무슨 뜻인지 알 수 있습니다. –

0

당신이 자바 스크립트를 사용한다고했기 때문에 나는 자바 스크립트 만 사용했습니다. 그러나 jquery에서 이러한 일을하는 더 쉬운 방법이 있습니다. 나는 그것을 테스트하지 않았고, 그것을 썼다. 그래서 어떤 문제가 있었다면, 그것에 대해 논평하는 것을 망설이지 말라.

function Group(data) 
{ 
    var result = []; 

    for (var item in data) 
    { 
     var group = (item.group) ? item.group : -1; 

     if (!result[group]) 

      result[group] = []; 

     result[group].push(item); 
    } 

    return result; 
} 

var secondGroup = Group(
    [ 
     {"id":"0", "name":"Person 0"}, 
     {"id":"1", "name":"Person 1","group":"0"}, 
     {"id":"2", "name":"Person 2","group":"0"}, 
     {"id":"3", "name":"Person 3","group":"2"}, 
     {"id":"4", "name":"Person 4","group":"2"}, 
     {"id":"5", "name":"Person 5","group":"4"}, 
     {"id":"6", "name":"Person 6","group":"4"}, 
     {"id":"7", "name":"Person 7","group":"0"}, 
     {"id":"8", "name":"Person 8","group":"7"} 
    ] 
)[2]; 

건배

관련 문제