我有这个起始数组:
const data = [
{
roles: [
{
name: "one",
},
{
name: "two",
},
],
name: "Alfa",
},
{
roles: [
{
name: "three",
},
],
name: "Bravo",
},
{
name: "Charlie",
},
];
我需要为每个名称创建一个对象。如果一个名称有多个角色,则为名称添加一项。
所以,在这个例子中,我需要这个数组:
[
{ name: "Alfa", role: "one" },
{ name: "Alfa", role: "two" },
{ name: "Bravo", role: "three" },
{ name: "Charlie" }
];
这是我写的函数:
const cleanRoles = (data) => {
const roles = data.map((person) => {
if (Array.isArray(person.roles) && person.roles.length > 0) {
return person.roles.map((role) => {
return {
name: person.name,
role: role.name,
};
});
}
return {
name: person.name,
};
});
return roles;
};
但我得到
[
[
{ name: "Alfa", role: "one" },
{ name: "Alfa", role: "two" },
],
[{ name: "Bravo", role: "three" }],
{ name: "Charlie" },
];
我如何重构我的函数以获得我需要的东西?
4条答案
按热度按时间vsaztqbk1#
一个reduce,一个forEach,以及易于阅读的代码...(对吧?)
8wigbo562#
如果在每个对象中交换
name
和roles
属性,并更统一地写出它们,那么就可以更好地理解所发生的事情。我重新排列了下面的数据结构,使数据看起来更容易阅读。您可以将其简化为以下内容:将数组中的每个项Map到具有
name
和role
的对象(仅当该项具有roles
时)。lmyy7pcs3#
通过将角色Map到新的数组项来减少数据。避免使用
.flatMap()
,因为它比reducing慢:具有任意数量属性的通用解决方案:
eqzww0vc4#
flatMap
做了map
做的事情,但是期望数组作为返回值,并将它们连接到一个大数组中作为输出: