【问题标题】:Sorting an array of votes by highest upvote to downvote ratio and vice versa按最高赞成票与反对票的比率对投票数组进行排序,反之亦然
【发布时间】:2018-06-07 16:11:12
【问题描述】:

我有一个人们可以投票的字符数组,并且投票存储在数组中。

我从中创建了两个新数组,我想对第一个数组进行排序,以便具有最佳赞成票与反对票比率的字符(在从赞成票中减去反对票后)位于数组的前面,而第二个应该是正好相反。

我对第一个数组的比较函数返回一个数组,其中 Edward 以 2:1 的赞成票与反对票的比率领先于 Magnetic 和 Goku,两者的赞成票与反对票的比率均为 1:0,这是不正确的;他们应该在阵列上领先于爱德华。

const characters = [
  { name: 'Sharpe', upvotes: 2, downvotes: 0 },
  { name: 'Edward', upvotes: 4, downvotes: 2 },
  { name: 'Magnetic', upvotes: 1, downvotes: 0 },
  { name: 'The', upvotes: 1, downvotes: 0 },
  { name: 'Goku', upvotes: 2, downvotes: 0 },
  { name: 'Zeros', upvotes: 1, downvotes: 1 }
];

characters.sort((a, b) => {
  return (b.upvotes - b.downvotes) - (a.upvotes - a.downvotes);
});

console.log(characters);

【问题讨论】:

  • 看起来你的比较函数并没有像上面的 cmets 所说的那样。对于数组 1,您不会减去反对票 (b.upvotes - b.downvotes) - (a.upvotes - a.downvotes)
  • 我没有看到你从赞成票中减去反对票。只有赞成票来自赞成票,反对票来自反对票。请检查您的排序逻辑。
  • @Peeper 不知道你为什么不只是edit and undelete this one....
  • @Patrick Roberts 谢谢,从现在开始我一定会这样做。抱歉,我还是新手。
  • upvotes - downvotes 不是比率

标签: javascript arrays node.js sorting ecmascript-6


【解决方案1】:

你的比较函数看起来有点不对劲:

(a, b) => {
  return b.upvotes - a.downvotes
}

a 的反对票与b 的赞成票进行比较 - 您实际上并没有比较 a 的 比率 与 b 的 比率。 p>

您必须分别计算 ab 的比率 - 使用 a.upvotes - a.downvotes 之类的东西(b 类似) - 然后比较它们。

const characters = [
  { name: 'Edward', upvotes: 21, downvotes: 30 },
  { name: 'Sharpe', upvotes: 37, downvotes: 200 },
  { name: 'And', upvotes: 45, downvotes: 3 },
  { name: 'The', upvotes: 0, downvotes: 0 },
  { name: 'Magnetic', upvotes: 1, downvotes: 0 },
  { name: 'Zeros', upvotes: 37, downvotes: 100 }
];

characters.sort((a, b) => {
  if (a.downvotes == 0 && b.downvotes == 0) {
      return b.upvotes - a.upvotes;
  }
  else if (a.downvotes == 0 && a.upvotes > 0) {
      return -1;
  }
  else if (b.downvotes == 0 && b.upvotes > 0) {
      return 1;
  }
  return (b.upvotes - b.downvotes) - (a.upvotes - a.downvotes);
});

console.log(characters);

【讨论】:

  • Magnetic 应该领先于“和”,因为他的赞成票与反对票的比例为 1:0。有没有办法做到这一点?我用您的解决方案更新了我的问题,并以演示我提到的缺陷的方式编辑了代码 sn-p。感谢您帮助我解决这个问题。
  • 编辑了我的解决方案 - 立即尝试。我假设您想要 1 个赞成票、0 个反对票高于 2 个赞成票、1 个反对票。还假设 0 up 0 down 高于 1 upvote,2 downvotes。这不是一个看起来非常优雅的解决方案,因为我想快速启动它,但希望它能完成工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 2012-12-15
  • 2010-12-04
  • 1970-01-01
  • 2021-06-19
  • 2018-07-08
相关资源
最近更新 更多