2016-06-02 2 views
-1

나는 2 개 배열로 객체가 어떤 객체를 포함하는 각 배열과 같이 가지고 :자신의 ID로 해당 객체의 수를 계산 자바 스크립트 객체에 필드를 추가

var obj = { 
    'parent' : [ 

     { id : 'ID_A', name : 'Joe' } 
     , { id : 'ID_B', name : 'Jim' } 
     , { id : 'ID_C', name : 'Edward' } 
     , { id : 'ID_D', name : 'Gary' } 
    ], 

    'child' : [ 

     { id : 'SOME_ID', parent_id : 'ID_A' } 
     , { id : 'SOME_ID', parent_id : 'ID_A' } 
     , { id : 'SOME_ID', parent_id : 'ID_A' } 
     , { id : 'SOME_ID', parent_id : 'ID_B' } 
     , { id : 'SOME_ID', parent_id : 'ID_B' } 
     , { id : 'SOME_ID', parent_id : 'ID_C' } 
     , { id : 'SOME_ID', parent_id : 'ID_D' } 
     , { id : 'SOME_ID', parent_id : 'ID_D' } 
    ] 
} 

내가 새 필드를 추가하고 싶습니다 각 parent 개체로 이동하여 child_count이라고 부릅니다. 이 필드는 parent_id 필드에 배열에있는 각 개체의 id 필드와 일치하는 필드가 포함 된 child 개체의 수입니다.

그래서 완성 된 제품은 다음과 같이 보일 것이다 :

var obj = { 
    'parent' : [ 

     { id : 'ID_A', name : 'Joe', child_count : 3 } 
     , { id : 'ID_B', name : 'Jim', child_count : 2 } 
     , { id : 'ID_C', name : 'Edward', child_count : 3 } 
     , { id : 'ID_D', name : 'Gary', child_count : 0 } 
    ], 

    'child' : [ 

     { id : 'SOME_ID', parent_id : 'ID_A' } 
     , { id : 'SOME_ID', parent_id : 'ID_A' } 
     , { id : 'SOME_ID', parent_id : 'ID_A' } 
     , { id : 'SOME_ID', parent_id : 'ID_B' } 
     , { id : 'SOME_ID', parent_id : 'ID_B' } 
     , { id : 'SOME_ID', parent_id : 'ID_C' } 
     , { id : 'SOME_ID', parent_id : 'ID_C' } 
     , { id : 'SOME_ID', parent_id : 'ID_C' } 
    ] 
} 
+0

@thatOneGuy 아무것도. 나는 밑줄 라이브러리를 사용하고 있는데, 나는 그것을 이미 깨뜨려 야한다고 생각하지만 벽에 부딪쳤다. – Daft

+0

이 라이브러리가 필요하지 않습니다. – thatOneGuy

답변

2

모든 부모에 대해 반복하십시오. 모든 학부모는 ID가있는 자녀를 필터링하십시오. 필터링 된 자식 배열의 길이를 가져 오면 부모 당 자식 수를 얻을 수 있습니다.

filter 방법에 대한 몇 가지 정보 : MDN

obj.parent.forEach(function(parent) { 
    parent.child_count = obj.child.filter(function(child) { 
    return child.parent_id === parent.id; 
    }).length; 
}); 

데모 : 어떤 괜찮은 결과를 생산 것 https://jsfiddle.net/exooyLo9/1/

+0

좋은 구현 방식, 내 방식보다 낫다. ++ – thatOneGuy

1

당신은 부모 개체에 대한 참조를 위해 개체를 사용하여 계산의를 반복 할 수있다.

var obj = { 'parent': [{ id: 'ID_A', name: 'Joe' }, { id: 'ID_B', name: 'Jim' }, { id: 'ID_C', name: 'Edward' }, { id: 'ID_D', name: 'Gary' }], 'child': [{ id: 'SOME_ID', parent_id: 'ID_A' }, { id: 'SOME_ID', parent_id: 'ID_A' }, { id: 'SOME_ID', parent_id: 'ID_A' }, { id: 'SOME_ID', parent_id: 'ID_B' }, { id: 'SOME_ID', parent_id: 'ID_B' }, { id: 'SOME_ID', parent_id: 'ID_C' }, { id: 'SOME_ID', parent_id: 'ID_D' }, { id: 'SOME_ID', parent_id: 'ID_D' }] }, 
 
    pointer = Object.create(null); 
 

 
obj.parent.forEach(function (a) { 
 
    a.child_count = 0; 
 
    pointer[a.id] = a; 
 
}); 
 

 
obj.child.forEach(function (a) { 
 
    pointer[a.parent_id].child_count++; 
 

 
}); 
 

 
console.log(obj);

+0

IMO 포인터 객체 – Pimmol

+0

을 만들 필요가 없지만 솔루션이 훨씬 복잡합니다. –

+0

동의하지 않는다. @Pimmol은 이해하기 쉽다. – thatOneGuy

0

예 바이올린 : https://jsfiddle.net/thatOneGuy/5113jumw/1/

그냥 속성 childCount를 만들고 0으로 설정 : 아이들을 통해

for (var i = 0; i < obj.parent.length; i++) { 
    obj.parent[i].childCount = 0; 
} 

그런 다음 루프를 자신의 부모를 확인합니다. 발견 된 경우 상위 부모 카운트가 1 씩 증가 함 :

for (var i = 0; i < obj.child.length; i++) { 
    for (var j = 0; j < obj.parent.length; j++) { 

    if (obj.child[i].parent_id == obj.parent[j].id) { 
     obj.parent[j].childCount++; 
    } 

    } 
}