Reputation: 555
i'm trying to add a property named 'link' to each sub object of a given list of object. The link is suposed to be a base url + each 'roleName' on top of the children.
In my case the link must be like that:
var baseUrl = 'http://baseUrl.com/';
link = baseUrl/Images/html5.png
or
link = baseUrl/Images/Framework/Javascript/angularJs.jpg
here's the initial list:
[
{
"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"
}
]
}
]
}
]
My problem is that i don't know how to do to add a link to each children and also a way to add 'Images' dynamically and not hard code it like i'm doing for the moment.
here's the function i have but i'm adding only links for the parent:
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;
};
Here's a link to my Plunker if someone want to help and thank you in advance.
EDIT: Vikash answer is not good
I want only links for childrens in objects when there is no children
For example:
{
'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'
}
]
}
Upvotes: 4
Views: 195
Reputation: 2734
Using the same principle as Vikash's solution, but tuning the base-case logic to match the OP's requirements, you have the below.
The main change is that the base-case is when there are no children; if there are children, recurse & add to the baseUrl
accordingly.
Note: These versions modify the existing list; it's a short jump to constructing/returning a new list.
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>');
Upvotes: 1
Reputation: 1141
Use the following recursive function :
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);
}
}
}
Example :
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));
Your updated plunker : http://plnkr.co/edit/ciwXIm
Upvotes: 1