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