Reputation: 43
[
{
"level1": 1,
"level2": 1,
"Id": 1
},
{
"level1": 1,
"level2": 1,
"Id": 2
},
{
"level1": 1,
"level2": 2,
"Id": 3
},
{
"level1": 1,
"level2": 2,
"Id": 4
},
{
"level1": 2,
"level2": 1,
"Id": 5
},
{
"level1": 2,
"level2": 1,
"Id": 6
},
{
"level1": 2,
"level2": 2,
"Id": 7
},
{
"level1": 2,
"level2": 2,
"Id": 8
}
]
output:-
[
{
"level1": 1,
"level1List": [
{
"level2": 1,
"level2List": [
{
"Id": 1
},
{
"Id": 2
}
]
},
{
"level2": 2,
"level2List": [
{
"Id": 3
},
{
"Id": 4
}
]
}
]
},
{
"level1": 2,
"level1List": [
{
"level2": 1,
"level2List": [
{
"Id": 5
},
{
"Id": 6
}
]
},
{
"level2": 2,
"level2List": [
{
"Id": 7
},
{
"Id": 8
}
]
}
]
}
]
How to get above output with es6
or loadesh
or other way?
Upvotes: 2
Views: 1395
Reputation: 386680
You could take a nested aproach by using an object as hash table with all items for this level, denoted by _
property of this level.
var data = [{ level1: 1, level2: 1, Id: 1 }, { level1: 1, level2: 1, Id: 2 }, { level1: 1, level2: 2, Id: 3 }, { level1: 1, level2: 2, Id: 4 }, { level1: 2, level2: 1, Id: 5 }, { level1: 2, level2: 1, Id: 6 }, { level1: 2, level2: 2, Id: 7 }, { level1: 2, level2: 2, Id: 8 }],
keys = ['level1', 'level2'],
result = [],
temp = { _: result };
data.forEach(function (a) {
keys.reduce(function (r, k) {
if (!r[a[k]]) {
r[a[k]] = { _: [] };
r._.push({ [k]: a[k], [k + 'list']: r[a[k]]._ });
}
return r[a[k]];
}, temp)._.push({ Id: a.Id });
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Upvotes: 2