snippetjavascriptMinor
Convert JSON to a different format (nested json)
Viewed 0 times
formatconvertdifferentnestedjson
Problem
This is really not a question. I was looking up this solution but couldn't find it anywhere. Thought of posting it here so it may save someone's time.
Here was my issue: I had a JSON coming from server which was not nested. Lets take example of Movies:
Now effectively speaking, there is no need for server to return it like this, however this was my case and since I was using
Here is the code which I wrote to convert it:
I am sure there would be a better approach for this. But for me it worked.
Here was my issue: I had a JSON coming from server which was not nested. Lets take example of Movies:
var movies = [
{"name":"Ice Age 3", "language":"English", "year":"2012"},
{"name":"Ice Age 3", "language":"French", "year":"2011"},
{"name":"Ice Age 3", "language":"German", "year":"2013"}
];Now effectively speaking, there is no need for server to return it like this, however this was my case and since I was using
jquery-template I wanted to have it as a nested JSON object. Something like this:var movies = [{
"name": "Ice Age 3",
"details": [
{"language": "English", "year": "2012"},
{"language": "French", "year": "2011"},
{"language": "German", "year": "2013"}
]
}];Here is the code which I wrote to convert it:
function convert(arr) {
var convertedArray = [];
$(arr).each(function () {
var found = false;
for (var i = 0; i < convertedArray.length; i++) {
if (convertedArray[i].name === this.name) {
found = true;
convertedArray[i].details.push({
"language": this.language,
"year": this.year
});
break;
}
}
if (!found) {
convertedArray.push({
"name": this.name,
"details": [{
"language": this.language,
"year": this.year
}]
});
}
});
return convertedArray;
}I am sure there would be a better approach for this. But for me it worked.
Solution
var found = false;Using flag is not good practice.
This is better solution:
var movies = [
{"name":"Ice Age 3", "language":"English", "year":"2012"},
{"name":"Ice Age 3", "language":"French", "year":"2011"},
{"name":"Ice Age 3", "language":"German", "year":"2013"},
{"name":"Ice Age 4", "language":"German", "year":"2013"}
];
function convert(arr) {
return $.map(unique(arr), function(name){
return {
name: name,
details: $.grep(arr, function(item){
return item.name == name
})
}
});
}
function unique(arr) {
var result = [];
$.map(arr, function(item){
if ($.inArray(item.name, result))
result.push(item.name);
})
return result;
}
console.log(convert(movies));Code Snippets
var found = false;var movies = [
{"name":"Ice Age 3", "language":"English", "year":"2012"},
{"name":"Ice Age 3", "language":"French", "year":"2011"},
{"name":"Ice Age 3", "language":"German", "year":"2013"},
{"name":"Ice Age 4", "language":"German", "year":"2013"}
];
function convert(arr) {
return $.map(unique(arr), function(name){
return {
name: name,
details: $.grep(arr, function(item){
return item.name == name
})
}
});
}
function unique(arr) {
var result = [];
$.map(arr, function(item){
if ($.inArray(item.name, result))
result.push(item.name);
})
return result;
}
console.log(convert(movies));Context
StackExchange Code Review Q#14429, answer score: 2
Revisions (0)
No revisions yet.