合并两个数组的更好方法

问题描述

我正在尝试让这段代码运行起来更实用。

我想根据 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

},[])
,

首先,请注意 findfilter 的用途不同。

这有点令人困惑,但如果我理解了,您想提取经理人和所有 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 列表中查看您的直线经理。

这在时间复杂度方面有点昂贵,但根据要求很简单。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...