Reputation: 697
I have Array of objects like this:
[ { season: 1,
episodes:
[
{
title:'ep1 title',
season:1,
},
{
title:'ep2 title',
season:1,
},
{
title:'ep3 title',
season:1,
}] },
{ season: 2,
episodes:
[ {
title:'ep1 title',
season:2,
},
{
title:'ep2 title',
season:2,
},
{
title:'ep3 title',
season:2,
} ] },
{ season: 3,
episodes:
[ {
title:'ep1 title',
season:3,
},
{
title:'ep2 title',
season:3,
},
{
title:'ep3 title',
season:3,
} ] },
]
And I want turn it to array like this with loadsh:
[
{
title:'ep1 title',
season:1,
},
{
title:'ep2 title',
season:1,
},
{
title:'ep3 title',
season:1,
},
{
title:'ep1 title',
season:2,
},
{
title:'ep2 title',
season:2,
},
{
title:'ep3 title',
season:2,
},
{
title:'ep1 title',
season:3,
},
{
title:'ep2 title',
season:3,
},
{
title:'ep3 title',
season:3,
}
]
I just want to get episodes transform object to array with lodash how to merge two arrays into a object using lodash lodash: count values from array of objects
Upvotes: 1
Views: 1774
Reputation: 351328
If it really has to be lodash, you can use _.flatMap
:
var flat = _.flatMap(data, 'episodes');
var data = [ { season: 1, episodes:[{title:'ep1 title',season:1,},{title:'ep2 title',season:1,},{title:'ep3 title',season:1,}] },{ season: 2,episodes:[ {title:'ep1 title',season:2,},{title:'ep2 title',season:2,},{title:'ep3 title',season:2,} ] },{ season: 3,episodes:[ {title:'ep1 title',season:3,},{title:'ep2 title',season:3,},{title:'ep3 title',season:3,} ] },];
var flat = _.flatMap(data, 'episodes');
console.log(flat);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
But JavaScript has since EcmaScript 2019 its own flatMap
, so you can just do:
var flat = data.flatMap( o => o.episodes );
var data = [ { season: 1, episodes:[{title:'ep1 title',season:1,},{title:'ep2 title',season:1,},{title:'ep3 title',season:1,}] },{ season: 2,episodes:[ {title:'ep1 title',season:2,},{title:'ep2 title',season:2,},{title:'ep3 title',season:2,} ] },{ season: 3,episodes:[ {title:'ep1 title',season:3,},{title:'ep2 title',season:3,},{title:'ep3 title',season:3,} ] },];
var flat = data.flatMap( o => o.episodes );
console.log(flat);
.as-console-wrapper { max-height: 100% !important; top: 0; }
If flatMap
is not available, you can use:
var flat = [].concat(...data.map( o => o.episodes ));
var data = [ { season: 1, episodes:[{title:'ep1 title',season:1,},{title:'ep2 title',season:1,},{title:'ep3 title',season:1,}] },{ season: 2,episodes:[ {title:'ep1 title',season:2,},{title:'ep2 title',season:2,},{title:'ep3 title',season:2,} ] },{ season: 3,episodes:[ {title:'ep1 title',season:3,},{title:'ep2 title',season:3,},{title:'ep3 title',season:3,} ] },];
var flat = [].concat(...data.map( o => o.episodes ));
console.log(flat);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Upvotes: 6
Reputation: 11136
No need to use any special lodash functions - this can be done very easily with basic javascript array .reduce()
like so:
var oldArr = [{
season: 1,
episodes: [{
title: 'ep1 title',
season: 1,
},
{
title: 'ep2 title',
season: 1,
},
{
title: 'ep3 title',
season: 1,
}
]
},
{
season: 2,
episodes: [{
title: 'ep1 title',
season: 2,
},
{
title: 'ep2 title',
season: 2,
},
{
title: 'ep3 title',
season: 2,
}
]
},
{
season: 3,
episodes: [{
title: 'ep1 title',
season: 3,
},
{
title: 'ep2 title',
season: 3,
},
{
title: 'ep3 title',
season: 3,
}
]
},
]
var newArr = oldArr.reduce(function(result, current) {
return result.concat(current.episodes);
}, []);
console.log(newArr);
Upvotes: 0