2016-06-02 8 views
-1

することにより、対応するオブジェクトの数をカウントするJavaScriptオブジェクトにフィールドを追加します。各parentオブジェクトに送信し、child_countと呼びます。このフィールドは、parent_idフィールドを含むchildオブジェクトの数で、アレイ内の各オブジェクトのidフィールドと一致します。は、私は2つの配列、そのようないくつかのオブジェクトを含む各配列を持つオブジェクトを持って彼らのID

だから、完成した製品は、次のようになります。

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++; 
    } 

    } 
} 
関連する問題