【问题标题】:get the highest role from array从数组中获取最高角色
【发布时间】:2019-12-02 16:21:35
【问题描述】:

我目前有一个数组u._roles,其中填充了来自“581199939464462340”等组的 id。 其次,我有一个字典,其中键是角色 ID,值是名称,例如 {key: "581199939464462340", value: "Member"}

现在我想获取数组中“最高”角色的名称。目前我有这个丑陋的 if 语句,但我认为可以做得更好,但是如何? (数组u._roles 是只读的)。

u._roles 可能如下所示:

["5812040340469414946", "581200340469415946", "581209222700597248"] 所以“最高”将是“581200340469415946”(如果是第二个)。 (然后从字典roleMap中得到这个id的名字)

var Rank;

if (u._roles.includes("581199939464462340")) {
    Rank = roleMap["581199939464462340"]; // highest
} else if (u._roles.includes("581200340469415946")) {
    Rank = roleMap["581200340469415946"]; //
} else if (u._roles.includes("581214123334041620")) {
    Rank = roleMap["581214123334041620"]; // 
} else if (u._roles.includes("588976480017448988")) {
    Rank = roleMap["588976480017448988"]; //
} else if (u._roles.includes("581203853635223574")) {
    Rank = roleMap["581203853635223574"]; // 
} else if (u._roles.includes("581209222700597248")) {
    Rank = roleMap["581209222700597248"]; // 
} else if (u._roles.includes("592436270031175681")) {
    Rank = roleMap["592436270031175681"]; // lowest
} else {
    Rank = "";
}

最高并不意味着最高的数字。它只是我喜欢使用的一个命令。

【问题讨论】:

  • 你能把u._roles里的内容贴出来吗?
  • 它只是一个普通数组,但我肯定会编辑问题
  • 最高不代表最高数。它只是我喜欢使用的一个顺序。 您必须通过一个键(例如priority: 1)在数组中指定某种顺序。数组只读是什么意思?
  • 这些看似随机的数字之间有什么关系吗?这样的数字可以存在多少。
  • @AnuragSrivastava 该顺序就像我目前正在从上到下检查 if 语句。只读意味着我无法更改 u 或 u._roles 对象的任何内容。

标签: javascript arrays node.js


【解决方案1】:

我用一些新的见解完全改变了这个答案。希望这对您有所帮助。


const rolePriority = {a:1, b:2, c:3, d:4};
const u = {"_roles": ['b','c', 'a']};

const rankNumber = u._roles.reduce((highest, role) => {
  const rank = rolePriority[role];
  return rank < highest ? rank : highest;
}, Infinity);

const rank = rankNumber === Infinity ? "" : roleMap[rankNumber]

【讨论】:

  • 所以things 会是u._roles
  • 我想我误解了你的问题。您有一个 uu 分配了许多 roles。您想找到最高角色并将Rank 设置为该角色的标签。
【解决方案2】:

我们只是将正确的顺序保存在一个数组中,循环它并检查该值是否包含在角色中。如果是,find 将返回它,我们可以将其放入 roleMap[findvalue]。

let order = ["581199939464462340", "581200340469415946", "581214123334041620", "588976480017448988", "581203853635223574", "581209222700597248","592436270031175681"],
    roles = ["5812040340469414946", "581200340469415946", "581209222700597248"];

let rank = order.find(v => roles.includes(v)); 

console.log(rank) // => 581200340469415946

将代码中的排名线替换为:

let rank = roleMap[order.find(v => roles.includes(v))]

如果您的订单或订单中的元素数量可能会发生变化,这将是混乱的,如果不是,您可以像这样保存它们进行比较。

【讨论】:

  • order 也可以是字典吗?所以我可以在.find() 之后直接获得价值?
  • 在这种情况下,字典或对象没有保证的顺序(最近可能发生了变化,但这是我目前的知识)。所以即使你可以迭代你的字典,你也不能保证你收到正确的元素。请参阅我在底部添加的代码 sn-p,它直接从您的 roleMap 返回相应的值(无论如何只需要 O(1))。
【解决方案3】:

先复制数组,然后按角色属性排序,取第一个元素。

var data = [{
    name: "Rank 1",
    role: "5812040340469414946",
  },
  {
    name: "Rank 2",
    role: "581200340469415946"
  },
  {
    name: "Rank 3",
    role: "581209222700597248"
  }
];

// Copy the source array to avoid mutating it using destructuring it
var copy = [...data];

// Sort by role property
var rank = copy.sort((a, b) => (+a.role) - (+b.role))[0].name;
console.log(rank);

【讨论】:

  • 虽然代码很优雅,但您忽略了这一点,即在这种情况下,较大的数字并不是最高的。 最高并不意味着最高的数字。 - 来自问题。
  • @AnuragSrivastava 目前尚不清楚在 OP 上下文中最高是什么意思
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
相关资源
最近更新 更多