2015-06-21 56 views
4

我試圖將名爲'鏈接'的屬性添加到給定的對象列表的每個子對象。 該鏈接被認爲是基地址 +每個'roleName'在孩子的上面。角度爲每個如何將屬性添加到每個子對象

在我的情況下,鏈接必須是這樣的:

var baseUrl = 'http://baseUrl.com/'; 
link = baseUrl/Images/html5.png 

link = baseUrl/Images/Framework/Javascript/angularJs.jpg 

這裏的初始列表:

[ 
    { 
    "roleName": "Images", 
    "roleId": "Images", 
    "children": [ 
     { 
     "roleName": "html5.png", 
     "roleId": "html5.png" 
     }, 
     { 
     "roleName": "css3.png", 
     "roleId": "css3.png" 
     }, 
     { 
     "roleName": "Javascript", 
     "roleId": "Javascript", 
     "children": [ 
      { 
      "roleName": "Framework", 
      "roleId": "Framework", 
      "children": [ 
       { 
       "roleName": "angularJs.jpg", 
       "roleId": "angularJs.jpg" 
       }, 
       { 
       "roleName": "emberJs.jpg", 
       "roleId": "emberJs.jpg" 
       } 
      ] 
      } 
     ] 
     }, 
     { 
     "roleName": "Php", 
     "roleId": "Php", 
     "children": [ 
      { 
      "roleName": "Framework", 
      "roleId": "Framework", 
      "children": [ 
       { 
       "roleName": "laravel.jpg", 
       "roleId": "laravel.jpg" 
       } 
      ] 
      }, 
      { 
      "roleName": "php5.jpg", 
      "roleId": "php5.jpg" 
      } 
     ] 
     } 
    ] 
    } 
] 

我的問題是,我不知道如何爲每個孩子添加一個鏈接,以及如何動態添加「圖片」,而不是像我正在做的那樣噸。

這裏的功能,我有但我只添加鏈接父:

var addLinks = function(listOfObjects, baseUrl){ 
    angular.forEach(listOfObjects, function(object){ 
     if(object.children !== 'undefined'){ 
      angular.forEach(object.children, function(item){ 
       item.link = baseUrl+'Images/'+item.roleName; 
      }); 
     } 
    }); 
    return listOfObjects; 
    }; 

這裏有一個鏈接到我的Plunker,如果有人想幫助,並感謝您提前。

編輯:Vikash答案是不好

我只想在對象兒童的鏈接時,有沒有孩子

例如:

{ 
     'roleName': 'Php', 
     'roleId': 'Php', 
     'children': [ 
     { 
     'roleName': 'Framework', 
     'roleId': 'Framework', 
     'children': [ 
      { 
      'roleName': 'laravel.jpg', 
      'roleId': 'laravel.jpg', 
      'link': 'http://exmaple.com/Images/Php/Framework/laravel.jpg' 
      } 
     ] 
     }, 
     { 
     'roleName': 'php5.jpg', 
     'roleId': 'php5.jpg', 
     'link': 'http://exmaple.com/Images/Php/php5.jpg' 
     } 
     ] 
     } 
+2

您可以編寫一個遞歸函數來做到這一點。 – Vikash

+0

我會建議重新考慮你的數據建模。你所要求的應該是一個功能,而不是你裝飾「清單」的財產。但是,考慮到您使用的層次結構,即使這樣也會很困難。 – Sinetheta

+0

檢查你想要的東西http://plnkr.co/edit/uiUoO38dmp0XyOwWsEpS?p=preview –

回答

1

使用相同的原則,Vikash的解決方案,但調整基本情況的邏輯相匹配的OP的要求,有以下。

主要的變化是基本情況是當沒有孩子時;如果有孩子,則相應地增加&加到baseUrl

Plunker

注:這些版本修改現有的列表;這是建立/返回新列表的短暫跳轉。

var data=[ 
 
    { 
 
    "roleName": "Images", 
 
    "roleId": "Images", 
 
    "children": [ 
 
     { 
 
     "roleName": "html5.png", 
 
     "roleId": "html5.png" 
 
     }, 
 
     { 
 
     "roleName": "css3.png", 
 
     "roleId": "css3.png" 
 
     }, 
 
     { 
 
     "roleName": "Javascript", 
 
     "roleId": "Javascript", 
 
     "children": [ 
 
      { 
 
      "roleName": "Framework", 
 
      "roleId": "Framework", 
 
      "children": [ 
 
       { 
 
       "roleName": "angularJs.jpg", 
 
       "roleId": "angularJs.jpg" 
 
       }, 
 
       { 
 
       "roleName": "emberJs.jpg", 
 
       "roleId": "emberJs.jpg" 
 
       } 
 
      ] 
 
      } 
 
     ] 
 
     }, 
 
     { 
 
     "roleName": "Php", 
 
     "roleId": "Php", 
 
     "children": [ 
 
      { 
 
      "roleName": "Framework", 
 
      "roleId": "Framework", 
 
      "children": [ 
 
       { 
 
       "roleName": "laravel.jpg", 
 
       "roleId": "laravel.jpg" 
 
       } 
 
      ] 
 
      }, 
 
      { 
 
      "roleName": "php5.jpg", 
 
      "roleId": "php5.jpg" 
 
      } 
 
     ] 
 
     } 
 
    ] 
 
    } 
 
]; 
 

 
function addLinks(data, baseUrl) { 
 
    data.forEach(function(e) { 
 
    if(!e.children) { 
 
     e.link = baseUrl + e.roleName; 
 
    } else { 
 
     addLinks(e.children, baseUrl + e.roleName + '/'); 
 
    } 
 
    }); 
 
} 
 

 
addLinks(data, 'http://baseUrl.com/'); 
 
document.write('<pre>' + JSON.stringify(data, null, 2) + '</pre>');

+0

謝謝你,這是完美的 – adam

1

使用遞歸函數如下:

function add(data,baseUrl){ 

    for(var i=0;i<data.length;i++){ 
     data[i].link=baseUrl+'Images/'+data[i].roleName; 
     if(data[i].children){ 
      add(data[i].children,baseUrl); 
     } 
    } 
} 

例子:

var data=[ 
 
    { 
 
    "roleName": "Images", 
 
    "roleId": "Images", 
 
    "children": [ 
 
     { 
 
     "roleName": "html5.png", 
 
     "roleId": "html5.png" 
 
     }, 
 
     { 
 
     "roleName": "css3.png", 
 
     "roleId": "css3.png" 
 
     }, 
 
     { 
 
     "roleName": "Javascript", 
 
     "roleId": "Javascript", 
 
     "children": [ 
 
      { 
 
      "roleName": "Framework", 
 
      "roleId": "Framework", 
 
      "children": [ 
 
       { 
 
       "roleName": "angularJs.jpg", 
 
       "roleId": "angularJs.jpg" 
 
       }, 
 
       { 
 
       "roleName": "emberJs.jpg", 
 
       "roleId": "emberJs.jpg" 
 
       } 
 
      ] 
 
      } 
 
     ] 
 
     }, 
 
     { 
 
     "roleName": "Php", 
 
     "roleId": "Php", 
 
     "children": [ 
 
      { 
 
      "roleName": "Framework", 
 
      "roleId": "Framework", 
 
      "children": [ 
 
       { 
 
       "roleName": "laravel.jpg", 
 
       "roleId": "laravel.jpg" 
 
       } 
 
      ] 
 
      }, 
 
      { 
 
      "roleName": "php5.jpg", 
 
      "roleId": "php5.jpg" 
 
      } 
 
     ] 
 
     } 
 
    ] 
 
    } 
 
]; 
 
    function add(data,baseUrl){ 
 

 
    for(var i=0;i<data.length;i++){ 
 
     data[i].link=baseUrl+'Images/'+data[i].roleName; 
 
     if(data[i].children){ 
 
      add(data[i].children,baseUrl); 
 
     } 
 
    } 
 
} 
 
add(data,'http://baseUrl.com/'); 
 
document.write(JSON.stringify(data,null,4));

您更新plunker:http://plnkr.co/edit/ciwXIm

+0

感謝Vikash爲你幫助,但它不是exactely我想要你在所有對象上都加了一個鏈接,但是我只需要一個鏈接** **對於沒有孩子的兒童或對象...並且爲每個文件添加的路徑是不正確.. – adam

相關問題