Search code examples
javascriptarraysreactjsrate

javascript - calculate success rate for every 10 objects in an array


i have the following array which can contain up to 30 objects its dynamic for each user.

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

what i need to do is make a function which will check the success rate for every 10 objects and add a key called "successRate" with the success rate of the last 10 objects depending on the times succeeded was true. if there are less than 10 objects left it will calculate the success rate on the amount of objects left (for example if there are 27 objects in the array it will check the success rate for the first 10 then the other 10 then for 7).

the output for the example array should be:

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

however if the array's length is for example 13, it will first check the first 10 objects and give them all the same successrate, then check the other 3 and give them all the same success rate. for example:

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%},
]

Solution

  • Here's a solution using recursion to chunk the array...

    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; }