javascript - 按值比较数组中的所有对象

标签 javascript arrays ecmascript-6 javascript-objects ecmascript-2016

我试图根据某些条件确定数组中哪个对象的属性值大于其他对象。

我有一组代表员工及其直线经理的对象,如果一个人向直线经理汇报工作与其他人相同,但他们的Rank更高,我希望能够将这一点反射(reflect)在属性 LineManager 添加 1。Tomas 就是一个很好的例子,他的 Rank 为 6 并向 Peter 报告但所有其他向 Peter 汇报的人的排名均为 5。

我已经成功地获得了正确的输出:

const data = [
  {
    Name: 'Peter',
    ReportsTo: '',
    LineManager: '',
    Rank: 4
  },
  {
    Name: 'Tom',
    ReportsTo: 'Peter',
    LineManager: 0,
    Rank: 5
  },
  {
    Name: 'Adam',
    ReportsTo: 'Peter',
    LineManager: 0,
    Rank: 5
  },
  {
    Name: 'Maria',
    ReportsTo: 'Peter',
    LineManager: 0,
    Rank: 5
  },
  {
    Name: 'Fiona',
    ReportsTo: 'Maria',
    LineManager: 0,
    Rank: 7
  },
  {
    Name: 'William',
    ReportsTo: 'Maria',
    LineManager: 0,
    Rank: 6
  },
  {
    Name: 'Tomas',
    ReportsTo: 'Peter',
    LineManager: 0,
    Rank: 6
  },
  {
    Name: 'Vicky',
    ReportsTo: 'Maria',
    LineManager: 0,
    Rank: 6
  }
]

const lineManager = data.find(({ ReportsTo }) => ReportsTo === '').Name

const rest = data.filter(item => (item.ReportsTo === lineManager))

const min = Math.min.apply( Math, rest.map(({ Rank }) => Rank ))

const final = data.map(item => {

  if (item.Rank > min && item.ReportsTo !== '' && item.ReportsTo === lineManager) {
    return {
      ...item,
      LineManager: 1
    }
  } else {
    return {
      ...item
    }
  }
})

console.log(final)

但是我怎样才能做到更深层次呢?例如,FionaMaria 汇报,Rank 为 7,而 William 则为 6。理想情况下 Fiona 还将有一个 LineManager: 1

期望的输出是这样的,但顺序不相关

[ 
  { Name: 'Peter', ReportsTo: '', LineManager: '', Rank: 4 }, 
  { Name: 'Tom', ReportsTo: 'Peter', LineManager: 0, Rank: 5 }, 
  { Name: 'Adam', ReportsTo: 'Peter', LineManager: 0, Rank: 5 }, 
  { Name: 'Maria', ReportsTo: 'Peter', LineManager: 0, Rank: 5 },
  { Name: 'Tomas', ReportsTo: 'Peter', LineManager: 1, Rank: 6 },  
  { Name: 'William', ReportsTo: 'Maria', LineManager: 0, Rank: 6 }, 
  { Name: 'Vicky', ReportsTo: 'Maria', LineManager: 0, Rank: 6 },
  { Name: 'Fiona', ReportsTo: 'Maria', LineManager: 1, Rank: 7 } 
] 

最佳答案

您可以收集所有 ReportsTo 组的最低排名,如果 Rank 不是该组的最小值,则可以使用递增值映射新对象。

const
    data = [{ Name: 'Peter', ReportsTo: '', LineManager: '', Rank: 4 }, { Name: 'Tom', ReportsTo: 'Peter', LineManager: 0, Rank: 5 }, { Name: 'Adam', ReportsTo: 'Peter', LineManager: 0, Rank: 5 }, { Name: 'Maria', ReportsTo: 'Peter', LineManager: 0, Rank: 5 }, { Name: 'Fiona', ReportsTo: 'Maria', LineManager: 0, Rank: 7 }, { Name: 'William', ReportsTo: 'Maria', LineManager: 0, Rank: 6 }, { Name: 'Tomas', ReportsTo: 'Peter', LineManager: 0, Rank: 6 }, { Name: 'Vicky', ReportsTo: 'Maria', LineManager: 0, Rank: 6 }],
    temp = data.reduce((r, o) => {
        r[o.ReportsTo] ??= Number.POSITIVE_INFINITY;
        if (r[o.ReportsTo] > o.Rank) r[o.ReportsTo] = o.Rank;
        return r;
    }, {}),
    result = data.map(o => ({ ...o, LineManager: temp[o.ReportsTo] === o.Rank
        ? o.LineManager
        : o.LineManager + 1
    }));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 按值比较数组中的所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66583269/

相关文章:

javascript - 切换翻译术语

javascript - 从数组中随机选择字体并且不重复

javascript - 参数无效 - Edge 浏览器中的 Google map 错误

javascript - Reducer 没有将对象添加到数组中,而是添加了 null

javascript - Pin It 按钮出现在错误的位置

javascript - Node.js 和 Express : Sequential execution flow one mongodb query request after another

javascript - 如何合并数组中的值或索引

arrays - Ruby 合并排序——这个递归函数是如何工作的?

javascript - 在另一个文件中使用时找不到 module.exports 值

javascript - 获取元素名称的标准兼容方式