2015-08-19 10 views
8

Sto avendo un array JSON con proprietà come id e parentActivityId.Non è possibile inserire un oggetto nell'array padre identificando l'id padre dell'oggetto in javascript

$scope.data = [ 
    { 
     id: 1, 
     activityName: "Drilling", 
     parentActivityId: 0, 
     items: [ 
      { 
       id: 2, 
       activityName: "Blasting", 
       parentActivityId: 1, 
       items: [ 
        { 
         id: 3, 
         activityName: "Ann", 
         parentActivityId: 2, 
         items: [], 

        }, 
        { 
         id: 4, 
         activityName: "Ann", 
         parentActivityId: 2, 
         items: [], 

        } 
       ] 
      }, 
      { 
       id: 5, 
       activityName: "Transport", 
       parentActivityId: 1, 
       items: [ 
        { 
         id: 6, 
         activityName: "Daniel", 
         parentActivityId: 5, 
         items: [], 
        } 
       ] 
      } 
     ] 
    } 
]; 

vorrei spingere un nuovo elemento basato sul nuovo elemento parentActiityId .La sarà avere un nuovo id. Esempio: Se il mio oggetto è come questo:

{ 
    id: 7, 
    activityName: "Drilling", 
    parentActivityId: 1, 
    items: [] 
} 

poi il mio oggetto sarà simile a questa ..

$scope.data = [ 
     { 
      id: 1, 
      activityName: "Drilling", 
      parentActivityId: 0, 
      items: [ 
       { 
        id: 2, 
        activityName: "Blasting", 
        parentActivityId: 1, 
        items: [ 
         { 
          id: 3, 
          activityName: "Ann", 
          parentActivityId: 2, 
          items: [], 

         }, 
         { 
          id: 4, 
          activityName: "Ann", 
          parentActivityId: 2, 
          items: [], 

         }, 
        { 
         id: 7, 
         activityName: "Drilling", 
         parentActivityId: 2, 
         items: [], 
        } 
        ] 
       }, 
       { 
        id: 5, 
        activityName: "Transport", 
        parentActivityId: 1, 
        items: [ 
         { 
          id: 6, 
          activityName: "Daniel", 
          parentActivityId: 5, 
          items: [], 
         } 
        ] 
       } 
      ] 
     } 
    ]; 

ho provato dando questo ciclo for ..

var arrObj = { 
    id: 7, 
    activityName: "Drilling", 
    parentActivityId: 1, 
    items: [] 
}; 

function populateObj(arrObj) { 
    for (var i = 0; i < $scope.data.length; i++) { 
     if ($scope.data[i].id == arrObj.parentActivityId) { 
      $scope.data.push(arrObj); 
     } 
    } 
}; 

populateObj(arrObj); 

che spingerò solo al genitore. Voglio identificare anche il bambino nel ciclo for e il push nell'oggetto array specifico identificando thr parentActivityId.Qualsiasi aiuto sarà molto apprezzato.

risposta

5

Con una proposta ricorsiva e Array.prototype.reduce():

var data=[{id:1,activityName:"Drilling",parentActivityId:0,items:[{id:2,activityName:"Blasting",parentActivityId:1,items:[{id:3,activityName:"Ann",parentActivityId:2,items:[]},{id:4,activityName:"Ann",parentActivityId:2,items:[]}]},{id:5,activityName:"Transport",parentActivityId:1,items:[{id:6,activityName:"Daniel",parentActivityId:5,items:[]}]}]}], 
 
    child = { id: 7, activityName: "Drilling", parentActivityId: 1, items: [] }; 
 

 
function getParent(r, a) { 
 
    return a.id === child.parentActivityId ? a : a.items.reduce(getParent, r); 
 
} 
 

 
var node = data.reduce(getParent, {}); 
 
'items' in node && node.items.push(child); 
 

 
document.write('<pre>' + JSON.stringify(data, 0, 4) + '</pre>');

+0

Se non ci sono dati es., Dati = []. Non riesco ad aggiungere un nuovo elemento figlio? – forgottofly

+1

quindi hai bisogno di ''if (items' in node) {node.items.push (child); } else {data.push (child); } '. ma si presta attenzione al possibile errore 'parentId'. –

+0

Grazie a @Nina Scholz..Il modo di cui ho bisogno. Puoi spiegare il tuo codice.Non ho familiarità con la funzionalità di riduzione. Puoi mandarmi un messaggio a [email protected] – forgottofly

2

Eri vicino a quello che hai cercato di raggiungere. Questo dovrebbe fare il trucco:

var arrObj = { 
    id: 7, 
    activityName: "Drilling", 
    parentActivityId: 1, 
    items: [] 
}; 

function populateObj(data, arrObj) { 
    for (var i = 0; i < data.length; i++) { 
     if (data[i].id == arrObj.parentActivityId) { 
      data[i].items.push(arrObj); 
     } else { 
      populateObj(data[i].items, arrObj); 
     } 
    } 
}; 

populateObj(arrObj); 
+0

Volevo controllare l'interno anche gli oggetti che non sto facendo in se ($ scope.data [i] .id == arrObj.parentActivityId). Come controllare se arr0bj.parentActivityId esiste anche all'interno dell'array degli oggetti? – forgottofly

+0

Qual è lo scopo di questo controllo? – Erazihel

+0

Se parentActivityId è 7, devo controllare anche gli oggetti all'interno dell'array di elementi – forgottofly

0

Per controllare gli oggetti all'interno elementi array come bene, si può fare qualcosa di simile,

var objectList = [ 
     { 
      id: 1, 
      activityName: "Drilling", 
      parentActivityId: 0, 
      items: [ 
       { 
        id: 2, 
        activityName: "Blasting", 
        parentActivityId: 1, 
        items: [ 
         { 
          id: 3, 
          activityName: "Ann", 
          parentActivityId: 2, 
          items: [], 

         }, 
         { 
          id: 4, 
          activityName: "Ann", 
          parentActivityId: 2, 
          items: [], 

         }, 
        { 
         id: 7, 
         activityName: "Drilling", 
         parentActivityId: 2, 
         items: [], 
        } 
        ] 
       }, 
       { 
        id: 5, 
        activityName: "Transport", 
        parentActivityId: 1, 
        items: [ 
         { 
          id: 6, 
          activityName: "Daniel", 
          parentActivityId: 5, 
          items: [], 
         } 
        ] 
       } 
      ] 
     } 
    ]; 

var arrObj = { 
    id: 7, 
    activityName: "Drilling", 
    parentActivityId: 1, 
    items: [] 
}; 

function populateObj(ItemList) { 
    for (var i = 0; i < ItemList.length; i++) { 
     if (ItemList[i].id == arrObj.parentActivityId) { 
      ItemList[i].items.push(arrObj); 
     } 
     else 
     { 
     populateObj(ItemList[i].items); 
     } 
    } 
}; 

populateObj(objectList); 
Problemi correlati