微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

合并两个数组的更好方法

如何解决合并两个数组的更好方法

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

我想根据 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 列表中查看您的直线经理。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?