2015-08-19 24 views
8

Tôi đang có một mảng JSON có thuộc tính là id và parentActivityId.Không thể đẩy đối tượng vào mảng mẹ bằng cách xác định id cha của đối tượng trong 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: [], 
        } 
       ] 
      } 
     ] 
    } 
]; 

Tôi muốn đẩy một mục mới dựa trên mục mới parentActiityId .Công sẽ có một mới id. Ví dụ: Nếu đối tượng của tôi là như thế này:

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

sau đó đối tượng của tôi sẽ giống như thế này ..

$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: [], 
         } 
        ] 
       } 
      ] 
     } 
    ]; 

tôi đã cố gắng bằng cách đưa ra này vòng lặp 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); 

mà sẽ chỉ đẩy đến parent.I muốn xác định con cũng như trong vòng lặp for và push tới đối tượng mảng cụ thể bằng cách xác định thr parentActivityId. Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

Trả lời

5

Với một đề nghị đệ quy và 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

Nếu không có dữ liệu tức là., Dữ liệu = []. Tôi không thể thêm phần tử con mới? – forgottofly

+1

thì bạn cần ''nếu (các mục trong nút) {node.items.push (con); } else {data.push (con); } '. nhưng bạn phải chú ý đến 'parentId' có thể sai. –

+0

Cảm ơn @Nina Scholz..Its làm việc theo cách tôi cần.Có thể bạn hãy giải thích mã của bạn. Tôi không quen với chức năng giảm. Bạn có thể nhắn tin cho tôi tại [email protected] – forgottofly

2

Bạn đã gần với những gì bạn đã cố gắng đạt được. Điều này sẽ làm các trick:

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

Tôi muốn kiểm tra bên trong đối tượng cũng như mà tôi không làm trong if ($ scope.data [i] .id == arrObj.parentActivityId). Làm thế nào để kiểm tra xem arrObj.parentActivityId tồn tại bên trong mảng các mục là tốt? – forgottofly

+0

Mục đích của việc kiểm tra này là gì? – Erazihel

+0

Nếu parentActivityId là 7 thì tôi phải kiểm tra các đối tượng bên trong mảng items cũng như – forgottofly

0

Để kiểm tra các đối tượng bên trong mảng mục là tốt, bạn có thể làm một cái gì đó như thế này,

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); 
Các vấn đề liên quan