Javascript 为每个子对象添加特性的方法

Javascript 为每个子对象添加特性的方法,javascript,angularjs,Javascript,Angularjs,我正在尝试向给定对象列表的每个子对象添加一个名为“link”的属性。 该链接被设置为一个基本url+每个'roleName'位于子级之上 在我的情况下,链接必须是这样的: var baseUrl = 'http://baseUrl.com/'; link = baseUrl/Images/html5.png 或 以下是初步列表: [ { "roleName": "Images", "roleId": "Images", "children": [ {

我正在尝试向给定对象列表的每个子对象添加一个名为“link”的属性。 该链接被设置为一个基本url+每个'roleName'位于子级之上

在我的情况下,链接必须是这样的:

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

以下是初步列表:

[
  {
    "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;
  };
这里有一个链接,如果有人想帮助我并提前感谢你

编辑:维卡什的答案不好

我只想要对象中没有子对象时的子对象链接

例如:

{
       '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'
        }
       ]
      }

使用以下递归函数:

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);
       }
   }
}
函数添加(数据,baseUrl){

对于(var i=0;i,使用与Vikash的解决方案相同的原理,但调整基本情况逻辑以匹配OP的要求,您有以下内容

主要的变化是基本情况是没有子项;如果有子项,则相应地递归并添加到
baseUrl

注意:这些版本修改了现有列表;这是构建/返回新列表的一个跳转

var数据=[
{
“roleName”:“图像”,
“roleId”:“图像”,
“儿童”:[
{
“roleName”:“html5.png”,
“roleId”:“html5.png”
},
{
“roleName”:“css3.png”,
“roleId”:“css3.png”
},
{
“roleName”:“Javascript”,
“roleId”:“Javascript”,
“儿童”:[
{
“roleName”:“框架”,
“roleId”:“框架”,
“儿童”:[
{
“roleName”:“angularJs.jpg”,
“roleId”:“angularJs.jpg”
},
{
“roleName”:“emberJs.jpg”,
“roleId”:“emberJs.jpg”
}
]
}
]
},
{
“roleName”:“Php”,
“roleId”:“Php”,
“儿童”:[
{
“roleName”:“框架”,
“roleId”:“框架”,
“儿童”:[
{
“roleName”:“laravel.jpg”,
“roleId”:“laravel.jpg”
}
]
},
{
“roleName”:“php5.jpg”,
“roleId”:“php5.jpg”
}
]
}
]
}
];
函数addLinks(数据、baseUrl){
data.forEach(函数(e){
如果(!e.儿童){
e、 link=baseUrl+e.roleName;
}否则{
addLinks(e.children,baseUrl+e.roleName+'/');
}
});
}
添加链接(数据,'http://baseUrl.com/');

document.write(''+JSON.stringify(data,null,2)+'');
您可以编写一个递归函数来实现这一点。我建议重新考虑您的数据建模。您需要的应该是函数,而不是装饰“列表”的属性与。但是,考虑到您所使用的层次结构,即使这样也会很有挑战性。检查您想要的东西。我编辑了问题,因为Vikash给出的答案不是很好。感谢Vikash的帮助,但这并不完全是我想要的。您正在加载所有对象的链接,但我只需要儿童或obje中的链接ct没有子文件时…并且为每个文件添加的路径不正确。。
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);
       }
   }
}