【问题标题】:javascript - calculate success rate for every 10 objects in an arrayjavascript - 计算数组中每 10 个对象的成功率
【发布时间】:2021-04-27 20:53:35
【问题描述】:

我有以下数组,它可以包含多达 30 个对象,每个用户都是动态的。

const array = [
{name: x, succeeded: true},
{name: y, succeeded: false},
{name: z, succeeded: true},
]

我需要做的是创建一个函数,它将检查每 10 个对象的成功率,并添加一个名为“successRate”的键,其中最后 10 个对象的成功率取决于成功的时间是真的。如果剩下的对象少于 10 个,它将计算剩余对象数量的成功率(例如,如果数组中有 27 个对象,它将检查前 10 个的成功率,然后检查其他 10 个,然后检查 7 个)。

示例数组的输出应该是:

const array = [
{name: x, succeeded: true, successRate: 66.66%},
{name: y, succeeded: false, successRate: 66.66%},
{name: z, succeeded: true, successRate: 66.66%},
]

但是,如果数组的长度例如为 13,它将首先检查前 10 个对象并给予它们相同的成功率,然后检查其他 3 个对象并给予它们所有相同的成功率。 例如:

const array = [
{name: 1, succeeded: true, successRate: 80%},
{name: 2, succeeded: true, successRate: 80%},
{name: 3, succeeded: true, successRate: 80%},
{name: 4, succeeded: true, successRate: 80%},
{name: 5, succeeded: false, successRate: 80%},
{name: 6, succeeded: true, successRate: 80%},
{name: 7, succeeded: true, successRate: 80%},
{name: 8, succeeded: false, successRate: 80%},
{name: 9, succeeded: true, successRate: 80%},
{name: 10, succeeded: true, successRate: 80%},
{name: 11, succeeded: false, successRate: 66.66%},
{name: 12, succeeded: true, successRate: 66.66%},
{name: 13, succeeded: true, successRate: 66.66%},
]

【问题讨论】:

  • 任何前 10 个对象?前 10 个同名对象?你的问题不清楚。也请分享您迄今为止的尝试。
  • 你能找出我添加的另一个例子吗?基本上我需要每10个对象的成功率

标签: javascript arrays reactjs rate


【解决方案1】:

这是一个使用递归来分块数组的解决方案...

const
  array = [{ name: 1 }, { name: 2, succeeded: true }, { name: 3, succeeded: true }, { name: 4, succeeded: true }, { name: 5, succeeded: false }, { name: 6, succeeded: true }, { name: 7, succeeded: true }, { name: 8, succeeded: false }, { name: 9, succeeded: true }, { name: 10, succeeded: true }, { name: 11, succeeded: false }, { name: 12, succeeded: true }, { name: 13, succeeded: true },],

  calculateSucessRate = (arr) => {
    const { sum, length } = arr.reduce((a, { succeeded }) => {
      if (succeeded !== undefined) {
        a.length += 1;
        a.sum += succeeded;
      }
      return a;
    }, { sum: 0, length: 0 });

    return sum / length;
  },

  successRateByChunk = (arr, chunkSize) => {
    if (!arr.length) { return []; }

    const chunk = arr.slice(0, chunkSize);
    const successRate = `${calculateSucessRate(chunk) * 100}%`;

    return [
      ...chunk.map(o => ({ ...o, successRate })),
      ...successRateByChunk(arr.slice(chunkSize), chunkSize)
    ];
  };

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

【讨论】:

  • epic function man 我将使用它,因为这是一个给出最终结果并且工作得非常好的函数。谢谢
  • 而让这个函数更宏大的原因是我可以使用我的分页变量作为第二个参数,这样我总是可以在当前页面上进行计算:) 惊人的代码
  • 我还有一个小问题,我相信您可以在函数中修复它以使其发挥最佳效果!在数组内部,我还有一些不包含“成功”键的对象(它们还不是真或假)。这些对象使一切都显示为 NaN :( 您能否修复函数以使其忽略这些对象?(例如,如果 10 块有 3 个对象没有成功的键,则计算将除以 7 而不是 10)。谢谢非常
  • 已编辑以适应您的评论,方法是在 reduce 中添加检查并对长度求和以及真实值的总和。
【解决方案2】:

您可以执行以下操作:

const array = [
  {name: 1, succeeded: true,},
  {name: 2, succeeded: true},
  {name: 3, succeeded: true},
  {name: 4, succeeded: true},
  {name: 5, succeeded: false},
  {name: 6, succeeded: true},
  {name: 7, succeeded: true},
  {name: 8, succeeded: false},
  {name: 9, succeeded: true,},
  {name: 10, succeeded: true},
  {name: 11, succeeded: false},
  {name: 12, succeeded: true},
  {name: 13, succeeded: true},
]

const arrays = [];
const size = 10;
// first split input into chunks of 10 or less
for (let i = 0; i < array.length; i += size) {
   arrays.push(array.slice(i, i + size));
}

const result = arrays.forEach(chunk => { // do following for each chunk

   //find number of succeeded items
   let succeeded = chunk.filter(item => item.succeeded).length;

   // find success rate based on number of items in chunk
   let rate = `${(succeeded/chunk.length) * 100}%`;

   // add current success rate to every item in chunk
   chunk.forEach(item => item.successRate = rate);
});

console.log(arrays.flat());

【讨论】:

  • 传说中的兄弟,非常感谢,这正是我要找的东西
  • 顺便说一句,将所有这些数组分散到 1 个新数组中并保持原样(假设我不知道它的大小)的最佳方法是什么?
  • 使用.flatMap() 而不是.forEach()
  • @pilchard 我得到相同的结果有什么区别?
  • 您需要将flatMap 的结果分配给一个新变量。
猜你喜欢
  • 2011-08-14
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多