javascript - angular for each 如何为每个子对象添加属性

标签 javascript angularjs

我正在尝试将名为“链接”的属性添加到给定对象列表的每个子对象。 该链接应该是一个 base url + 每个 'roleName' 在 child 之上。

在我的例子中,链接必须是这样的:

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"
          }
        ]
      }
    ]
  }
]

我的问题是我不知道如何为每个 child 添加链接,也不知道如何动态添加“图像”而不是像我目前正在做的那样硬编码。

这是我的功能,但我只为父级添加链接:

  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 答案不好

当没有 child 时,我只想要对象中 child 的链接

例如:

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

最佳答案

使用与 Vikash 的解决方案相同的原理,但调整基本案例逻辑以匹配 OP 的要求,您有以下内容。

主要变化是基本情况是没有 child 的情况;如果有 child ,递归并相应地添加到 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>');

关于javascript - angular for each 如何为每个子对象添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30968203/

相关文章:

javascript - mongodb 查询检查是否存在具有匹配值的其他文档

javascript - 按功能过滤 ng-repeat

javascript - Angular : can a controller watch server properties?

angularjs - 将属性作为对象属性获取到指令 AngularJs 中

javascript - Underscore/Lodash 与 From Scratch

JavaScript eval ("{}") 返回行为?

javascript - Google 闭包编译器和 UMD 模式

javascript - 如何将 ngx-loading-bar 作为预加载器添加到 Angular 项目中

javascript - CKEditor 问题 : How to apply custom css to CKEditor

javascript - 给定超时后关闭 md-tooltip