问题描述
我正在尝试让这段代码运行起来更实用。
我想根据 list
中的姓名选择过滤一组数据,然后根据每个人的 ReportsTo
递归查找他们的直线经理,但前提是 {{1 }} 大于 3。
这行得通,但有没有更好更简洁的方法来实现相同的结果?
Rank
const data = [
{
Name: 'Peter',ReportsTo: '',Rank: 1
},{
Name: 'Tom',ReportsTo: 'Peter',Rank: 2
},{
Name: 'Maria',ReportsTo: 'Tom',Rank: 3
},{
Name: 'Liam',ReportsTo: 'Maria',Rank: 4
},{
Name: 'John',{
Name: 'Fiona',ReportsTo: 'Liam',Rank: 5
}
]
// Start with only these names
const list = ['Fiona','Tom']
const filtered = data.filter(({Name}) => list.includes(Name))
// Recursively find the missing managers of the list names if the rank is not below 3
const findManager = (manager) => {
const next = data.find(({ Name}) => Name === manager)
return next.Rank > 3
? [next,...findManager(next.ReportsTo)]
: [next]
}
// Check the line managers for the filtered array and store them
const missingManagers = []
for (const { ReportsTo,Rank} of filtered) {
if(!list.includes(ReportsTo) && Rank > 3) {
missingManagers.push(...findManager(ReportsTo))
}
}
// Merge the missing managers with the filtered list
const result = [...missingManagers,...filtered]
console.log(result)
解决方法
我找到了这个解决方案,但仍然不确定它是否更好
const result = filtered.reduce((total,current) => {
if(!list.includes(current.ReportsTo) && current.Rank > 3) {
total.push(
current,...findManager(current.ReportsTo)
)
} else total.push(current)
return total
},[])
,
这有点令人困惑,但如果我理解了,您想提取经理人和所有 Rank > 4 的人(经理与否)?
const data = [
{
Name: "Peter",ReportsTo: "",Rank: 1,},{
Name: "Tom",ReportsTo: "Peter",Rank: 2,{
Name: "Maria",ReportsTo: "Tom",Rank: 3,{
Name: "Liam",ReportsTo: "Maria",Rank: 4,{
Name: "John",{
Name: "Fiona",ReportsTo: "Liam",Rank: 5,];
const managers = [];
data.forEach((element) => {
if (element.ReportsTo && !managers.includes(element.ReportsTo)) {
managers.push(element.ReportsTo);
}
});
const filtered = data.filter((element) => {
if (managers.includes(element.Name) || managers.includes(element.ReportsTo) || element.Rank > 3) return element;
return false;
});
console.log(filtered);
,
试试这个
getLineManagersAboveRankThree() {
return data.filter(person => person.Rank >= 3 &&
data.some(({ReportsTo}) => ReportsTo === person.Name)
);
}
当集合中的任何一个元素满足条件时,方法 some
将返回 true
。因此,您可以在 data
列表中查看您的直线经理。
这在时间复杂度方面有点昂贵,但根据要求很简单。