admin管理员组文章数量:1316645
Imagine that I have the following JSON array:
[
{
"team": "Colts",
"players": [
{
"name": "Andrew Luck",
"position": "quarterback"
},
{
"name": "Quenton Nelson",
"position": "guard"
}
]
},
{
"team": "Patriots",
"players": [
{
"name": "Tom Brady",
"position": "quarterback"
},
{
"name": "Shaq Mason",
"position": "guard"
}
]
}
]
And I want to transform and flatten the JSON to be the following:
[
{
"name": "Andrew Luck",
"position": "quarterback",
"team": "Colts"
},
{
"name": "Quenton Nelson",
"position": "guard",
"team": "Colts"
},
{
"name": "Tom Brady",
"position": "quarterback",
"team": "Patriots"
},
{
"name": "Shaq Mason",
"position": "guard",
"team": "Patriots"
}
]
How would I do this with either ES6 or lodash syntax?
Imagine that I have the following JSON array:
[
{
"team": "Colts",
"players": [
{
"name": "Andrew Luck",
"position": "quarterback"
},
{
"name": "Quenton Nelson",
"position": "guard"
}
]
},
{
"team": "Patriots",
"players": [
{
"name": "Tom Brady",
"position": "quarterback"
},
{
"name": "Shaq Mason",
"position": "guard"
}
]
}
]
And I want to transform and flatten the JSON to be the following:
[
{
"name": "Andrew Luck",
"position": "quarterback",
"team": "Colts"
},
{
"name": "Quenton Nelson",
"position": "guard",
"team": "Colts"
},
{
"name": "Tom Brady",
"position": "quarterback",
"team": "Patriots"
},
{
"name": "Shaq Mason",
"position": "guard",
"team": "Patriots"
}
]
How would I do this with either ES6 or lodash syntax?
Share Improve this question asked Mar 29, 2019 at 18:02 Jim G.Jim G. 15.4k23 gold badges108 silver badges176 bronze badges7 Answers
Reset to default 5With simple loops (ES2015):
const players = [];
for (const team of teams) {
for (const player of team.players) {
players.push(Object.assign({team: team.team}, player));
}
}
You can use object spread instead of Object.assign
if your environment supports it.
With Array#flatMap
(will officially be part of ES2019, or use lodash):
const players = teams.flatMap(
team => team.players.map(player => {...player, team: team.team})
);
Use Array#reduce
method along with Array#map
method.
let res = data.reduce((arr, { team, players }) => arr.concat(players.map( obj => ({...obj, team }))), []);
// or
let res = data.reduce((arr, { team, players }) => [...arr, ...players.map( obj => ({...obj, team }))], []);
// or
let res = data.reduce((arr, { team, players }) => (arr.push(...players.map( obj => ({...obj, team }))),arr), []);
var data = [{
"team": "Colts",
"players": [{
"name": "Andrew Luck",
"position": "quarterback"
},
{
"name": "Quenton Nelson",
"position": "guard"
}
]
},
{
"team": "Patriots",
"players": [{
"name": "Tom Brady",
"position": "quarterback"
},
{
"name": "Shaq Mason",
"position": "guard"
}
]
}
]
let res = data.reduce((arr, {
team,
players
}) => arr.concat(players.map(obj => ({ ...obj,
team
}))), []);
// or
let res1 = data.reduce((arr, {
team,
players
}) => [...arr, ...players.map(obj => ({ ...obj,
team
}))], []);
// or
let res2 = data.reduce((arr, {
team,
players
}) => (arr.push(...players.map(obj => ({ ...obj,
team
}))), arr), []);
console.log(res, res1, res2)
You can use lodah's _.flatMap()
to iterate the array and flatten the result. Internally use _.map()
to iterate the players and add the team
using object spread:
const arr = [{"team":"Colts","players":[{"name":"Andrew Luck","position":"quarterback"},{"name":"Quenton Nelson","position":"guard"}]},{"team":"Patriots","players":[{"name":"Tom Brady","position":"quarterback"},{"name":"Shaq Mason","position":"guard"}]}]
const result = _.flatMap(arr, ({ team, players }) =>
_.map(players, o => ({ team, ...o }))
)
console.log(result)
<script src="https://cdnjs.cloudflare./ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
You can do the same with Array.flatMap()
and Array.map()
:
const arr = [{"team":"Colts","players":[{"name":"Andrew Luck","position":"quarterback"},{"name":"Quenton Nelson","position":"guard"}]},{"team":"Patriots","players":[{"name":"Tom Brady","position":"quarterback"},{"name":"Shaq Mason","position":"guard"}]}]
const result = arr.flatMap(({ team, players }) =>
players.map(o => ({ team, ...o }))
)
console.log(result)
<script src="https://cdnjs.cloudflare./ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
const data = [
{
"team": "Colts",
"players": [
{
"name": "Andrew Luck",
"position": "quarterback"
},
{
"name": "Quenton Nelson",
"position": "guard"
}
]
},
{
"team": "Patriots",
"players": [
{
"name": "Tom Brady",
"position": "quarterback"
},
{
"name": "Shaq Mason",
"position": "guard"
}
]
}
]
const flatData = data.map(d => {
const { team } = d
const assignedPlayers = d.players.map(player => ({ team, ...player }))
return assignedPlayers
}).flat()
console.log(flatData)
With ES6 (spread operator) along with reduce
and concat
:
const arr = [{
"team": "Colts",
"players": [{
"name": "Andrew Luck",
"position": "quarterback"
},
{
"name": "Quenton Nelson",
"position": "guard"
}
]
},
{
"team": "Patriots",
"players": [{
"name": "Tom Brady",
"position": "quarterback"
},
{
"name": "Shaq Mason",
"position": "guard"
}
]
}
]
console.log(arr.reduce((acc, obj) => {
return acc.concat(...obj.players.map(player => {
return Object.assign({
team: obj.team
}, player)
}))
}, []));
This can be done simply using the following code! Check it!
var inputArray = [{"team":"Colts","players":[{"name":"Andrew Luck","position":"quarterback"},{"name":"Quenton Nelson","position":"guard"}]},{"team":"Patriots","players":[{"name":"Tom Brady","position":"quarterback"},{"name":"Shaq Mason","position":"guard"}]}]
var result = [];
inputArray.forEach(function(elem) {
const players = elem.players;
players.forEach(function(child) {
const obj = {};
obj["name"] = child.name;
obj["position"] = child.position;
obj["team"] = elem.team;
result.push(obj);
});
});
console.log(result);
.as-console-wrapper{max-height: 100% !important; top:0px;}
Here is another alternative with a bination of Array.reduce()
and Array.forEach()
:
let input = [
{
"team": "Colts",
"players": [
{
"name": "Andrew Luck",
"position": "quarterback"
},
{
"name": "Quenton Nelson",
"position": "guard"
}
]
},
{
"team": "Patriots",
"players": [
{
"name": "Tom Brady",
"position": "quarterback"
},
{
"name": "Shaq Mason",
"position": "guard"
}
]
}
];
let output = input.reduce((acc, {team, players}) =>
{
players.forEach(({name, position}) => acc.push({name, position, team}));
return acc;
}, []);
console.log(output);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
本文标签: javascriptES6 How do I unravel inner arrays and flatten the JSON arrayStack Overflow
版权声明:本文标题:javascript - ES6: How do I unravel inner arrays and flatten the JSON array? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741954183a2406887.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论