A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Reduce Reloaded

8/19
Recursos

Aportes 117

Preguntas 8

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Asi resolv铆 el ejercicio:

const data = [
  {
    name: "Nicolas",
    level: "low",
  },
  {
    name: "Andrea",
    level: "medium",
  },
  {
    name: "Zulema",
    level: "hight",
  },
  {
    name: "Santiago",
    level: "low",
  },
  {
    name: "Valentina",
    level: "medium",
  },
  {
    name: "Lucia",
    level: "hight",
  },
];

mi soluci贸n 馃槉馃槉:

Devolver un solo objeto, aunque contenga 鈥渕uchos elementos鈥 sigue siendo un solo elemento de tipo objeto, y es por eso que se dice que reduce() solo devuelve un 煤nico valor.
.
Ac谩 mi resoluci贸n al reto, seguramente se podr铆a hacer much铆simo mejor:

const numbers = [1,2,3,3,4,5,2,1,1,3,4,5,6,7,5,5,4,7,8,9,8,7,5,4,5,8,9];
const ranges = ['1-5','6-7','8-9'];

const result = numbers.reduce((acum, item) => {
  if (item < 5) {
    !acum[ranges[0]] ? acum[ranges[0]] = 1 : acum[ranges[0]] += 1;
  } else if (item > 5 && item < 8) {
    !acum[ranges[1]] ? acum[ranges[1]] = 1 : acum[ranges[1]] += 1;
  } else {
    !acum[ranges[2]] ? acum[ranges[2]] = 1 : acum[ranges[2]] += 1;
  }
  return acum
},{})

console.log(result)

Aqu铆 esta mi soluci贸n al problema:

Esta es mi soluci贸n al reto. Supongo que se puede limpiar m谩s.

// reto
const arr = [3, 10, 9, 4, 3, 1, 8, 4, 7, 6];
const result = arr.reduce((obj, item) => {
  if (item <= 5) {
    obj['1-5']++
  } else if (item <= 8) {
    obj['6-8']++
  } else {
    obj['9-10']++
  }
  return obj
}, {
  '1-5': 0,
  '6-8': 0,
  '9-10': 0
})

console.log(result)

aqui mi soluci贸n

const a=[1,2,5,7,1,1,2,3,4,3,2,4,4,5,6,7,9,10,8,45,7,3,2]

const rst=a.reduce((obj,item)=>{
   //console.log(item)

   if(item>=1 && item<=5){
       obj.de1a5= obj.de1a5+1;
   }

   if(item>=6 && item<=8){
    obj.de6a8=obj.de6a8+1;
    }

if(item>=9 && item<=10){
  obj.de9a10=obj.de9a10+1;
    }

    return obj

},{de1a5:0,de6a8:0,de9a10:0})

console.log(rst);

Reduce

El m茅todo reduce() puede ser usado en cualquier array de elementos.
Cuando se llama, reduce() ejecuta una funci贸n reductora (proporcionada por ti) en cada elemento del array, resultando en un solo valor de salida, el acumulador.
_

Ejemplo de uso #1 (ES6+) - Sumar

Cuando quieres sumar todos los elementos que contiene un array.

La funci贸n reduce() recorrer谩 cada elemento del array y lo sumar谩 al acumulador.
_

Ejemplo de uso # 2 - Para contar coincidencias

Si quieres saber cu谩ntas veces se repite un elemento dentro de un array.

Para contar el n煤mero de veces que se repite un valor, nuestro valor inicial tiene que ser un objeto, de esta manera podemos retornar los pares key-value como el resultado.
reduce() en este ejemplo inicializa cada elemento encontrado con el valor 1, despu茅s, si lo encuentra de nuevo, ese valor se incrementa y el resultado se asigna al objeto key.
_

Ejemplo de uso #3 - Aplanamiento

Cuando quieres aplanar arrays del interior de un objeto.

Los datos a menudo se anidan de maneras complicadas. Lo que hace reduce en este ejemplo es recorrer cada instancia de colors desde la matriz y hace un push de cada valor encontrado al acumulador, lo que resultar谩 en un array aplanado que contiene todos los colores que se encuentran dentro del objeto.
_

Tips 脷tiles 鉁

Tip #1

Si no se le pasa un valor inicial a la funci贸n reduce(), autom谩ticamente asumir谩 que el primer elemento en el array es el valor inicial. Esto funcion贸 en el ejemplo 1, porque solo sumamos una lista de n煤meros, pero en los otros dos ejemplos si lo necesitamos porque queremos recorrer el array con un valor inicial vac铆o e ir agregando los valores despu茅s, para construir el resultado.
_

Tip #2

No olvidar retornar el total (el acumulador). Siempre revisar que est谩s retornando el valor que necesitas.
_

Tip #3

Recuerda, la funci贸n reduce() puede tomar 2 par谩metros:

  1. El callback (funci贸n para recorrer cada elemento del array)
  2. El valor inicial (valor a usar la primera vez que se ejecute el callback)
    _

Tip #4

El callback tambi茅n requiere dos par谩metros:

  1. El acumulador.
  2. El valor actual.

隆Espero les sirva! 馃槈

Mi solucion, claro que puede ser mejorada

const numbers=[1,2,3,4,5,6,7,8,9,10];
const ranges = ['1-3','4-7','8-10']
const result = ranges.reduce((obj,item)=>{
    const range=item.split('-')
    const suma = numbers.reduce((sum,dato) => {
         dato >=parseInt(range[0]) && dato <=parseInt(range[1])?sum = sum + 1:null
        return sum},0)
    obj[item]=suma
    return obj
},{})

Esta es mi solucion del reto 馃槃

Reto

const arr = [1,2,3,5,7,7,10,9,12,34];
// {1-5: 3, 6-8: 2, 9-10:1}

const result = arr.reduce((obj, item)=> {
    if(item > 0 && item < 11){
        if(item < 6){
            obj["1-5"] += 1
        }else if(item < 8){
            obj["6-8"] += 1
        }else{
            obj["9-10"] += 1
        }
    }
      return obj;
} , { '1-5': 0, '6-8': 0, '9-10': 0 });

console.log(result);

Mi soluci贸n al reto:

numbers = [9,6,5,8,7,4,1,2,3,6,5,2,1,4,7,8,9,6,6,2,5,4,9,6,6,5,5,6];
const numbersRangle = numbers.reduce((obj,item) =>{
    if(item >= 1 && item <= 5){
        if(!obj['1-5']){
            obj['1-5'] = 1;
        }else{
            obj['1-5'] += 1;
        }
    }else if(item >= 6 && item <= 8){
        if(!obj['6-8']){
            obj['6-8'] = 1;
        }else{
            obj['6-8'] += 1;
        }
    }else if(item >= 9 && item <= 10){
        if(!obj['9-10']){
            obj['9-10'] = 1;
        }else{
            obj['9-10'] += 1;
        }
    }

    return obj;
},{});

console.log(numbersRangle); 

Les comparto mi soluci贸n

const itemsrange = [1, 3, 2, 3,5 ,7 ,6 ,9 ,9 ,10];

const rst = itemsrange
.reduce((obj, item) => {
    if(item <= 5){
        obj["1-5"] += 1;
    } else if (item <=8){
        obj["6-8"] += 1;
    } else if (item <=10){
        obj["9-10"] += 1;
    }
    return obj;
}, {
    "1-5": 0,
    "6-8": 0,
    "9-10": 0,

})

console.log(rst);

Muchachos les dejo esta solucion donde reduce tambien les toma el valor del indice del arreglo:

Mi soluci贸n:

const numbers = [1,2,3,3,4,5,2,1,1,3,4,5,6,7,5,5,4,7,8,9,8,7,5,4,5,8,9];

const groupedNumbers = numbers.reduce((prev, c) => ({
	...prev,
	[c]: !prev[c] ? 1 : prev[c] + 1
}), {});

console.log("groupedNumbers", groupedNumbers);

Saludos 0_o

Mi soluci贸n

Les dejo el objeto del ejercicio a mano 馃槂

const data = [
  {
    name: "Nicolas",
    level: "low",
  },
  {
    name: "Andrea",
    level: "medium",
  },
  {
    name: "Zulema",
    level: "hight",
  },
  {
    name: "Santiago",
    level: "low",
  },
  {
    name: "Valentina",
    level: "medium",
  },
  {
    name: "Lucia",
    level: "hight",
  },
];

Les comparto mi soluci贸n 馃

const rnd= [3,4,6,9,1,2,4,9,5,1,3,4,10,4,2,5,6,7,8,2,1,10,2,6,3];

const range = rnd.reduce((obj, item) => {
    item > 0 && item <= 5 ? obj['1-5'] += 1 : obj['1-5'] += 0;
    item > 5 && item <= 8 ? obj['6-8'] += 1 : obj['6-8'] += 0;
    item > 8 && item <= 10 ? obj['9-10'] += 1 : obj['9-10'] += 0;
    return obj;
},{'1-5': 0, '6-8': 0, '9-10': 0});
console.log(range);

const numbers = [1,2,3,4,5,6,7,8,9,10,4,8,2,1,5,3,1]
const countedNumbers = numbers.reduce((obj,item) => {
  if(item<=5) obj["1-5"] += 1;
  else if(item>5 && item<=10) obj["6-10"] += 1;
  else obj["10-15"] += 1;
  return obj
},{
  "1-5":0,
  "6-10":0,
  "10-15":0
})
console.log(countedNumbers)

reduce reloaded 1ra pr谩ctica llevada a react

me cost贸 bastante xq para renderizar el objeto que me devolv铆a el .reduce tuve que aprender los m茅todos Object (entries y value) y combinar estos con un map.
No me conform茅 con el console.log.
va mi codigo:

import { useState } from "react";
import "./App.css";

function App() {
  const [data, setData] = useState({});

  //   const myArray = [1, 2, 3, 4];

  const myArray = [
    {
      customerName: "Nicolas",
      total: 600,
      delivered: true,
    },
    {
      customerName: "Zulema",
      total: 120,
      delivered: false,
    },
    {
      customerName: "Santiago",
      total: 180,
      delivered: true,
    },
    {
      customerName: "Valentina",
      total: 600,
      delivered: true,
    },
  ];

  const myTotals = myArray.map((item) => item.total);

  const totalSales = myTotals.reduce((obj, item) => {
    if (!obj[item]) {
      obj[item] = 1;
    } else {
      obj[item] = obj[item] + 1;
    }
    return obj;
  }, {});

  const handleReduce = () => {
    console.log(totalSales);
    setData(totalSales);
  };

  return (
    <div className="App">
      <header className="App-header">
        <h1>veamos al m茅todo .reducePlus++</h1>
        <section className="data">
          <ul className="ul-key">
            {data &&
              Object.keys(data).map((item, index) => (
                <li className="li-keys" key={index}>{`${item} :`}</li>
              ))}
          </ul>
          <ul className="ul-value">
            {data &&
              Object.values(data).map((item, index) => (
                <li key={index}>{item}</li>
              ))}
          </ul>
        </section>
        <button onClick={handleReduce}>obtener total de ventas</button>
      </header>
    </div>
  );
}

export default App;

Reto con una peque帽a modificaci贸n

//RETO: de un array de n煤meros de 1 - 20, acumular por rangos de 1-5, 6-10, 11-15 y 16-20
const numbers2 = [1,3,5,6,9,4,3,10,11,19,17,5,18,20,9,13,7,14];
const beetween = (min,max, x) => (min <= x && x <= max);

const rpta3 = numbers2.reduce((obj, number) => {
    if(beetween(1,5,number)){
        obj['1-5'] ++;
    }else if(beetween(6,10,number)){
        obj['6-10'] ++;
    }else if(beetween(11,15,number)){
        obj['11-15'] ++;
    }else{
        obj['16-20'] ++;
    }
    return obj;
},{'1-5': 0, '6-10': 0, '11-15': 0, '16-20': 0})

console.log(rpta3);

Mi forma de resolver el reto:

const array = [5, 8, 6, 9, 5, 8, 8, 2, 3, 2, 4, 6, 10, 3, 10, 2, 9, 9, 9, 10, 7, 4, 4, 5, 5, 4, 10, 3, 2, 3, 6, 2, 9, 8, 9, 10, 7, 2, 8, 4];

const challenge = array.reduce((obj, num) => {
  if (num <= 5 && !obj['1-5']) {
    obj['1-5'] = 1
  } else if (num <= 5 && obj['1-5']) {
    obj['1-5'] += 1
  } else if (num >= 6 && num <= 8 && !obj['6-8']) {
    obj['6-8'] = 1
  } else if (num >= 6 && num <= 8 && obj['6-8']) {
    obj['6-8'] += 1
  } else if (num >= 9 && num <= 10 && !obj['9-10']) {
    obj['9-10'] = 1
  } else if (num >= 9 && num <= 10 && obj['9-10']) {
    obj['9-10'] += 1
  }
  return obj
}, {})

console.log(challenge)

(Para generar esos n煤meros aleatorios utilice esta pagina, no encontr茅 ning煤n bot贸n para copiar los n煤meros, los logre copiar utilizando el inspector de elementos y copiando el contenido, del contenedor (xd), que tenia los n煤meros)

Me parecio grandiosa idea de un estudiante que la hizo asi鈥

馃槉 Reto

const data = [1, 4, 2, 3, 3, 4, 4, 3, 1, 10, 3, 1, 4, 2, 3, 3, 4, 4, 3, 1, 10, 3, 2, 10, 10, 9, 9, 8, 7, 7, 6, 4, 9, 10, 5];

const rta = data.reduce((obj, item) => {
    if (item >= 1 && item <= 5) obj['1-5']++;
    if (item >= 6 && item <= 8) obj['6-8']++;
    if (item >= 9 && item <= 10) obj['9-10']++;

    return obj;
}, {
    '1-5': 0,
    '6-8': 0,
    '9-10': 0
});

console.table(rta);

Aporte del dejercicio
espero les sirva

const nums = [];
//Random numbers
for (let z = 0; z < 30; z++) {
  nums.push(Math.floor(Math.random() * 100));
}
//Reduce
const rta = nums.reduce(
  (acum, n) => {
    if (n <= 5) {
      acum["1-5"] += 1;
    } else if (n >= 6 && n <= 8) {
      acum["6-8"] += 1;
    } else {
      acum["9-10"] += 1;
    }
    return acum;
  },
  {
    "1-5": 0,
    "6-8": 0,
    "9-10": 0,
  }
);
console.log(rta);
console.log(nums);
//Output
//{ '1-5': 0, '6-8': 1, '9-10': 29 }
/*[
  85, 26, 88,  7, 71, 97, 77, 34, 12,
  70, 49, 13, 98,  9, 49, 68, 22, 10,
  15, 53, 35, 24, 88, 30, 30, 37, 13,
  25, 89, 45
]*/

Mi solucion:

nums.reduce((obj, num) => {
    if (num > 0 && num < 6) {
            obj['1-5'] = obj['1-5'] ? obj['1-5'] + 1 : 1  
    }else if (num <= 8 ) {
        obj['6-8'] = obj['6-8'] ? obj['6-8'] + 1 : 1 
    }else if (num <= 10) {
        obj['9-10'] = obj['9-10'] ? obj['9-10'] + 1 : 1 
    }
    return obj
}, {})

Creo que a este curso le vendr铆an fenomenal los QUIZ que hacen en otros cursos a lo largo del temario. Estoy viendo que al llegar al examen van a haber preguntas de esas que solo sabes si te memorizaste el detalle m谩s m铆nimo de lo que dice el profe.
Ya ver谩n.

//reto Agrupar numeros por rangos de un array y dar frecuencias de estos rangos.
const arr1 = ()=>{
    let arr= [];
    for(let i=0; i<100; i++){
        arr.push(parseInt(Math.random()*(100-1)+1))
    }
    return arr;
}

function getRangos(maxNumRanges , previoValue  , currentValue ){
    let elemento;
    let minOfRange ;
    let sizeOfRange =0;
    
    for(let i=0; i<=maxNumRanges; i++){
        minOfRange  = sizeOfRange+1;
        sizeOfRange += 10;
        
        if(minOfRange<=currentValue && currentValue <=sizeOfRange){
            elemento = `range_${minOfRange}_${sizeOfRange}`;
            if(!previoValue[elemento] ){
                previoValue[elemento] =1
            }   else{
                previoValue[elemento]++
            }
        }     
    }//for
    return previoValue;
}                

const rangosFrecuencia = (arr)=>{
    console.log("arr : ",arr.sort());
    return arr.reduce(
        (previoValue , currentValue , currentIndex,)=>{
           //>>>>>>>>>>>>>>>>>
           let sizeOfRange = 41
           previoValue = getRangos(10, previoValue , currentValue , sizeOfRange);
           //>>>>>>>>>>>>>>>>>
           return previoValue; 
        },{})
}

const miarr = arr1();
miarr.sort( (a,b)=>{a-b});
console.log("miarr ordenado" , miarr);
console.log("rangosFrecuencia :" ,rangosFrecuencia(miarr));

Esta es la soluci贸n por mi parte:

Hola, solucion al ejercicio:

const array=[1,2,3,4,3,4,3,2,3,4,3,3,4,3,5,3,5,6,8,9,7,6,8,7,6,7,6,5,5,5,6,4,3,2,1,2,2,3,4,5,7,8,7,9,8];

const rta=array.reduce((obj,item)=>{
    if(item<6&&item>0){
        obj.unocinco=obj.unocinco+1;
    }else if(item<9&&item>5){
        obj.cincoocho=obj.cincoocho+1;
    }else{
        obj.nuevediez=obj.nuevediez+1;
    }
    return obj;
},{
    unocinco:0,
    cincoocho:0,
    nuevediez:0
})
console.log(rta);

// Generamos un "array" con n elementos
let array = [];
const number = (() => {
    for (let i = 0; i <= 1000; i++) {
        array.push(i);
    }

})();
// Generamos un rango de agrupaci贸n
let range = array.filter(elem => elem % 500 == 0);

// Generamos un objeto que agrupa los valores del array

const arrayReloaded = array.reduce(function(obj, valueA) {


    for (let j = 0; j < range.length; j++) {
        let values = array.filter(element => element >= range[j] && element < range[j + 1]);

        obj[`${range[j]}-${range[j+1]}`] = values.length;

    }

    return obj;
}, {});
//Imprimimos en consola
console.log(arrayReloaded);
<
//RETO//
const numbers =[1,3,2,3,4,5,5,7,8,9,10,1,4,6,3,8,7,9,1];

const rta2 = numbers.reduce((obj, item)=>{
    if (item <=5) {
       obj["1-5"]+= 1;
    } else if (item<9){
        obj["6-8"] += 1;
    } else {
        obj["9-10"] += 1;
    }
    return obj;
},{
    "1-5": 0,
    "6-8":0,
    "9-10":0,
});

console.log(rta2);
>

Posible soluci贸n:

const randomNumber = [1, 1, 1, 2, 3, 4, 8, 6, 6, 8, 8, 8, 9, 10];

const rsta = randomNumber.reduce((obj, item) => {
  switch (item) {
    case 1 || 2 || 3 || 4 || 5:
      obj['1-5'] += 1;
      break;
    case 6 || 7 || 8:
      obj['6-8'] += 1;
      break;
    case 9 || 10:
      obj['9-10'] += 1;
      break;
    default:
      break;
  }
  return obj
}, {'1-5': 0, '6-8': 0, '9-10': 0})

console.log(rsta)

Hola, les dejo mi soluci贸n al reto:

const numbersList = [1, 12, 8, 7, 5, 3, 9, 2, 10];

const numberListAns = numbersList.reduce(
  (obj, element) => {
    switch (true) {
      case element > 0 && element < 5:
        obj["1-4"] += 1;
        break;
      case element > 4 && element < 9:
        obj["5-8"] += 1;
        break;

      default:
        obj["9-12"] += 1;
        break;
    }
    return obj;
  },
  {
    "1-4": 0,
    "5-8": 0,
    "9-12": 0,
  }
);

console.log(numberListAns);

Mi versi贸n al reto

Comparto mi soluci贸n del reto馃帀

const arrayPractica2 = [9,6,8,7,2,1,10,6,5,7];
const matriz2 = arrayPractica2.reduce((objetoAcumulado, item) => {
    if(item >= 1 && item <= 5){
        objetoAcumulado["1-5"] += 1;
    } else if (item >= 6 && item <= 8){
            objetoAcumulado["6-8"] += 1;          
        } else {
                objetoAcumulado["9-10"] += 1;
            }
            return objetoAcumulado          
    }, {
        "1-5": 0,
        "6-8": 0,
        "9-10": 0
    });
    console.log(matriz2); // {'1-5': 3,'6-8': 5,'9-10': 2}

Una de las tantas soluciones 鈥

// exercise
const dataEx = [1,2,3,4,5,6,7,8,9,9,10];
const resRange = dataEx.reduce((obj,item) => {
    if(item >= 1 && item <=5){
        obj['1-5']? obj['1-5'] += 1: obj['1-5']=1;
    }
    if(item >= 6 && item <=8){
        obj['6-8']? obj['6-8'] += 1: obj['6-8']=1;
    }
    if(item >= 9 && item <=10){
        obj['9-10']? obj['9-10'] += 1: obj['9-10']=1;
    }
    return obj
}, {});
console.log(resRange);

Alternativa, incluyendo el m茅todo Slice para recorrer la longitud que tiene cada rango. La cantidad es la sumatoria -1. 隆Espero sea de ayuda colegas!

Muy Interesante

Mi soluci贸n

Resultado

{ '1-4': 10, '5-7': 7, '8-10': 4 }

Basicamente es igual que otros aportes.
Pero funciona.

const rangos = [1, 3, 2, 5, 6, 7, 4, 6, 7, 9, 10, 1, 2, 4, 5, 7, 9, 8, 2, 3, 4];

const rta6 = rangos.reduce((obj, item) => {
    if (item >= 0 && item <= 4) {
        obj['1-4'] += 1;
    } else if (item >= 5 && item <= 7) {
        obj['5-7'] += 1;
    } else { obj['8-10'] += 1; }

    return obj;
}, { '1-4': 0, '5-7': 0, '8-10': 0 });

console.log(rta6);

Talvez alguien quiera intentarlo en TS

My solution:

Cost贸 y qued贸 algo largo, pero lo consegu铆! 馃槃

const items = [
    1, 4, 3, 5, 2, 6, 8, 8, 7, 7, 6, 5, 8, 8, 9, 10, 9, 9, 9, 9, 9, 5, 6, 8, 8,
    5, 8, 5,
];

const reto = items.reduce((obj, item) => {
    if (item <= 5) {
        let item = "1-5";
        if (!obj[item]) {
            obj["1-5"] = 1;
        } else {
            obj["1-5"] = obj[item] + 1;
        }
    }
    if (item <= 8 && item >= 6) {
        let item = "6-8";
        if (!obj[item]) {
            obj["6-8"] = 1;
        } else {
            obj["6-8"] = obj[item] + 1;
        }
    }
    if (item <= 10 && item >= 9) {
        let item = "9-10";
        if (!obj[item]) {
            obj["9-10"] = 1;
        } else {
            obj["9-10"] = obj[item] + 1;
        }
    }
    return obj;
}, {});

console.log(reto);

Las tablas con las iteraciones me recuerdan mis primeras clases de programaci贸n. Aun las sigo usando para entender c贸digo que de primera no entiendo.

Gracias por las memorias.

Les comparto mi c贸digo del reto. 馃槃

function betweenNumbers(object, number) {
    if (1 <= number && number <= 5) object['1-5']++;
    if (6 <= number && number <= 8) object['6-8']++;
    if (9 <= number && number <= 10) object['9-10']++;
    
    return object;
}

const ramdom = () => Math.floor(Math.random() * 10) + 1;

const numbers = [];
const numberRange = {
    '1-5': 0,
    '6-8': 0,
    '9-10': 0,
}

for (let index = 0; index <= 10; index++) {
    let ramdomNumber = ramdom();
    numbers.push(ramdomNumber);
}

const groupNumbers = numbers.reduce(betweenNumbers, numberRange);

console.log({numbers, groupNumbers});

mi soluci贸n al reto:

const items = [1, 2, 3, 2, 3, 3, 3, 2, 2, 1, 1, 10,5,5,6,4,7,8,9,7,9,9,9,8,8,7,7,4,6,6,6,5,10];

const nums = items.reduce((obj, item) => {
  if (item >= 1 && item <= 5) {
    obj['1-5']++;
  }
  if (item >= 6 && item <= 8) {
    obj['6-8']++;
  }
  if (item >= 9 && item <= 10) {
    obj['9-10']++;
  }
  return obj;
}, {
  '1-5': 0,
  '6-8': 0,
  '9-10': 0
});

console.log(nums);
let array =[];
for(i =0; i < 30; i++) {
    array.push(Math.floor(Math.random() * 11))
}
 
console.log(array);
 
const rta = array.reduce((obj, item) => {
    if (item <= 5) {
        obj['1-5']++
      } else if (item <= 8) {
        obj['6-8']++
      } else {
        obj['9-10']++
      }
      return obj
    }, {
 
      '1-5': 0,
      '6-8': 0,
      '9-10': 0
    })
   
    console.log(rta)
 
 
 





//RETO: CALCULAR EL RANGO DE LOS SIGUIENTES N脷MEROS    (beetwen)  N煤meros intermedios
const items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

const rta = items.reduce((obj, item) => {
    if (item <= 5) {
        obj['1-5'] ++;
    } else if (item <= 8) {
        obj['6-8'] ++
    } else {
        obj['9-10'] ++;
    }
    return obj;
}, {  '1-5':0,
      '6-8':0,
      '9-10':0,
  });
console.log(rta);

Aqu铆 est谩 mi soluci贸n del reto, qued贸 muy largo pero con la l贸gica explicita; espero le sirva a alguien.

//acc == accumulator && curr == current value
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const range = ["1-5", "6-8", "9-10"];
const rank = numbers.reduce((acc, curr) => {
  if(curr <= 5 && !acc[range[0]]) {
    acc[range[0]] = 1;
  } else if(curr <= 5 && acc[range[0]]) {
    acc[range[0]] += 1;
  } else if(curr >=6 && curr <9 && !acc[range[1]]) {
    acc[range[1]] = 1;
  } else if (curr >=6 && curr <9 && acc[range[1]]) {
    acc[range[1]] += 1;
  } else if(curr >=9 && curr <=10 && !acc[range[2]]) {
    acc[range[2]] = 1;
  } else if (curr >=9 && curr <=10 && acc[range[2]]) {
    acc[range[2]] += 1;
  } 
  return acc;
}, {})
console.log(rank);

Algo muy importante por Pipeline son comunicaci贸n entre procesos.
la salida de uno es la entrada de informaci贸n de otro

uff que clases mucho level

Mi soluci贸n din谩mica, para construir los intervalos, como una tabla estad铆stica.

//Lista de numeros
const numeros=[22,19,16,13,18,15,20,14,15,16,15,16,20,13,15,18,15,13,18,15];
//k-->interavlo, r-->Rango, a-->Amplitud
//Declaracion de variables
let max,min,r,k,a;
let li,ls;
let ranges =[];

//Calculos para generar intervalos en datos grupados
max=Math.max(...numeros);
min=Math.min(...numeros);
r=max-min;
k=intervalo(1+3.322*Math.log10(20));
a=Math.round(r/k);
li=min,ls=li+a;
console.log(`k: ${k} , r: ${r}, a=${a}`);

//Clase de los rangos de cada intervalo.
class Ran{
     constructor(ini,fin){
         this.ini=ini;
         this.fin=fin;
     }
}
//Cargar el Objeto con los intervalos
for(let i=1;i<=k;i++){
    ranges.push(new Ran(li,ls));
    li=ls;
    ls=(li)+a;
}
//Funcion para calcular K, en el caso que sea par
function intervalo(n){
    n=parseInt(n);
    if((n%2)==0) 
    {return n+1;}
    return n; 
}

numeros.map((itemNumber)=>{
    ranges.filter((itemRange,index)=>
    {
        if(itemNumber>=itemRange.ini && itemNumber<itemRange.fin){
        itemRange.xm=(itemRange.ini+itemRange.fin)/2;
            if(itemRange.f)
            {
                itemRange.f+=1;
            }else{
                itemRange.f=1;
            }
            return itemRange;
        }
    });
});
console.log('Count:',ranges);

Esta es mi soluci贸n al reto:

const totals = [1,2,3,4,5,6,7,8,9,10];

const ranges = [0,5,8,10]

const result = totals.reduce((histogram, number) => {
  if(number > ranges[0] && number <= ranges[1]) {
    if(!histogram[`${ranges[0]+1}-${ranges[1]}`]) {
      histogram[`${ranges[0]+1}-${ranges[1]}`] = 0;
    }
    histogram[`${ranges[0]+1}-${ranges[1]}`] += 1;
  }
  if(number > ranges[1] && number <= ranges[2]) {
    if(!histogram[`${ranges[1]+1}-${ranges[2]}`]) {
      histogram[`${ranges[1]+1}-${ranges[2]}`] = 0;
    }
    histogram[`${ranges[1]+1}-${ranges[2]}`] += 1;
  }
  if(number > ranges[2] && number <= ranges[3]) {
    if(!histogram[`${ranges[2]+1}-${ranges[3]}`]) {
      histogram[`${ranges[2]+1}-${ranges[3]}`] = 0;
    }
    histogram[`${ranges[2]+1}-${ranges[3]}`] += 1;
  }
  return histogram;
}, {});

console.log(result)

**Respeusta larga **
const rangeNumbers = [7, 6, 3, 4, 7, 5, 10, 1, 5, 6, 6, 1, 9, 10, 4];

const rta3 = rangeNumbers.reduce((obj, item) => {
if (item <= 5) {
if (!obj[鈥1-5鈥漖) {
obj[鈥1-5鈥漖 = 1;
} else {
obj[鈥1-5鈥漖 = obj[鈥1-5鈥漖 + 1;
}
} else {
if (item >= 6 && item <= 8) {
if (!obj[鈥6-8鈥漖) {
obj[鈥6-8鈥漖 = 1;
} else {
obj[鈥6-8鈥漖 = obj[鈥6-8鈥漖 + 1;
}
} else {
if (item >= 9) {
if (!obj[鈥9-10鈥漖) {
obj[鈥9-10鈥漖 = 1;
} else {
obj[鈥9-10鈥漖 = obj[鈥9-10鈥漖 + 1;
}
}
}
}

return obj;
}, {});

console.log(rta3);
**Respuesta corta **
const rta4 = rangeNumbers.reduce(
(obj, item) => {
if (item <= 5) {
obj[鈥1-5鈥漖;
} else {
if (item >= 6 && item <= 8) {
obj[鈥6-8鈥漖
;
} else {
obj[鈥9-10鈥漖++;
}
}

return obj;

},
{
鈥1-5鈥: 0,
鈥6-8鈥: 0,
鈥9-10鈥: 0,
}
);

console.log(rta4);

Esta es la forma en la que resolv铆 el reto, hice un array de rangos con el objetivo de poder agregar m谩s rangos de forma din谩mica, tambi茅n a帽ad铆 una funci贸n para generar los n煤meros de forma aleatoria.




Este es el resultado 馃憞



Cualquier sugerencia para mejorar es bienvenida y se agradece. 馃檪

Aqu铆 mi respuesta

const num = [1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10];

const responseFinal = num.reduce((obj, num) => {
    if (num >= 1 && num <= 5) { //5
        obj['1-5'] ++;
    } else if (num >= 6 && num <= 8) { //13
        obj['6-8'] ++;
    }
     else if (num >= 9 && num <= 10) { //5
        obj['9-10'] ++;
    }
    return obj;
}, {
    ['1-5']: 0, 
    ['6-8']: 0, 
    ['9-10']: 0
});

console.log(responseFinal);

Esta es mi soluci贸n al peque帽o challenge.

Debo mencionar que hace una semana, tuve una entrevista donde me hicieron solucionar dos escenarios y uno de ellos era bastante similar al challenge de esta lecci贸n. Yo hice mi soluci贸n utilizando map, pero si hubiera visto este video a tiempo, con reduce() era mas elegante.

Saludos buen contenido, bien explicado todo.

YO LA VERDAD lo hice mas simple
!

Comparto mi soluci贸n del ejercicio:

Method chaining

Funciones de orden mayor combinadas de forma elegante para lograr un resultado.

<// Method chaining
// Funciones de orden mayor
let employes = [
  { name: "Jhonson", salary: 95000, hireDate: "July 2, 1858" },
  { name: "Hansel", salary: 75000, hireDate: "Agust 25, 2009" },
  { name: "Devora", salary: 83000, hireDate: "November 12, 1985" },
];

// Combinadas de forma elegante
const totalHightier = employes
  .map((employes) => employes.salary)
  .filter((salary) => salary > 75000)
  .reduce((total, current) => total + current);

console.log(totalHightier);> 
const array = [1,2,5,6,8,10,13,2,14,15,28,20,18,24]
const r = ['1-5','6-10','11-15']

const rta = array.reduce((obj,e)=> {
    if (e <= 5){
        !obj[r[0]] ? obj[r[0]] = 1 : obj[r[0]] += 1 
    } else if (e > 5 && e <= 10) {
        !obj[r[1]] ? obj[r[1]] = 1 : obj[r[1]] += 1 
    } else if (e > 10 && e <= 15){
        !obj[r[2]] ? obj[r[2]] = 1 : obj[r[0]] += 1
    } else {
        !obj['otros'] ? obj['otros'] = 1 : obj['otros'] += 1
    }

    return obj
},{})

console.log(rta)

Output:
{ 鈥1-5鈥: 6, 鈥6-10鈥: 3, 鈥11-15鈥: 1, otros: 4 }

tambi茅n hice varias pruebas y lo realice retornando un objeto que tiene almacenado arrays con los n煤meros pares, impares y el conteo o cantidad de cada uno.

let array = [1,2,3,4,5,6,7,8,9,10]

let rta = array.reduce((obj,e)=>{
    if (e % 2 === 0){
        obj.pares.push(e)
        obj['countPar'] += 1  
    } else  {
        obj.impares.push(e)
        obj['countImpar'] += 1 
    }

    return obj
}, { countPar: 0, pares: [], countImpar: 0, impares: [],} )

console.log(rta)

Output:
{
countPar: 5,
pares: [ 2, 4, 6, 8, 10 ],
countImpar: 5,
impares: [ 1, 3, 5, 7, 9 ]
}

Mi soluci贸n:

const nums = [1, 6, 7, 10]

const rta = nums.reduce(
    (obj, num) => {
        if (num >= 1 && num <= 5) obj['1-5']++
        else if (num >= 6 && num <= 8) obj['6-8']++
        else if (num >= 9 && num <= 10) obj['9-10']++
        else obj['other']++

        return obj
    },
    { '1-5': 0, '6-8': 0, '9-10': 0, other: 0 }
)

console.log(rta)
// output
// {
//     '1-5': 1,
//     '6-8': 2,
//     9-10: 1
// }

As铆 lo resolvi yo鈥

const groupItems = items.reduce((objeto, item) => {
    objeto.forEach(element => {
        if (item >= element.min && item <= element.max) {
            element.cant++;
        }
    });
    return objeto;
}, [{min: 0, max: 3, cant: 0},
    {min: 4, max: 7, cant: 0},
    {min: 8, max: 1000000, cant: 0},
]);

Mi soluci贸n:

const objectByRanks = nums.reduce((obj, item) => {
    if(item >= 1 && item <= 5){
        obj['1-5']++;
    }else if(item > 5 && item <= 8){
        obj['6-8']++;
    }else if(item > 8 && item <= 10){
        obj['9-10']++;
    }else{
        if(obj['out of range']){
            obj['out of range']++;
        }else{
            obj['out of range'] = 1;
        }
    }
    return obj;
}, { '1-5':0, '6-8':0, '9-10':0});

As铆 lo solucion茅 yo:

const numbers = [1,2,2,2,6,7,7,7,7,7,9,9,9];

let range1_5 = 0;
let range6_8 = 0;
let range9_10 = 0;

const result = numbers.reduce((obj, number) => {
	if(number <= 5){
		range1_5 += 1;
	} else if(number >= 6 && number <= 8){
		range6_8 += 1;
	} else {
		range9_10 += 1;
	}

	obj['range1_5'] = range1_5;
	obj['range6_8'] = range6_8;
	obj['range9_10'] = range9_10;
	return obj;
}, {})

console.log(result)

Hola les comparto mi solucion.
Mi aproach fue crear una lista con los intervalos, asi considero que es mucho mas f谩cil de escalar y mantener ya que puedo configurar los rangos de manera muy rapida y f谩cil

Esta es mi soluci贸n 馃檪

  const arr = [1, 3, 1, 2, 3, 3, 4, 3, 3, 6, 4]
  const result = arr.reduce((acc, item) => {
    acc[item] = -~acc[item]
    return acc
  }, {})

El operador bitwise (operador bit a bit) es interesante, cuando aplicamos este operador a un n煤mero obtenemos una operaci贸n as铆: -(x + 1), esto significa que al n煤mero que tenemos le sumamos 1 y multiplicamos por -1 el resultado.

Si alguien necesita lo puedo explicar para que sea m谩s claro

Aqu铆 esta mi soluci贸n al reto.

const numbers = [4, 2, 1, 7, 3, 3, 2, 8, 4, 9, 10]

const rta = numbers.reduce((obj, item) => {
  if (item <= 5) obj["1 - 5"] += 1
  else if (item <= 8) obj["6 - 8"] += 1
  else obj["9 - 10"] += 1

  return obj
}, {
  "1 - 5": 0,
  "6 - 8": 0,
  "9 - 10": 0
})

Bueno excelente curso, un poco tarde pero he aqu铆 mi soluci贸n.

let data = [0, 2, 8, 5, 1, 8, 8, 6, 1, 9];
var res = data.reduce((prev, curr) => {
  if (curr > 0 && curr <= 5) prev['1-5'] = prev['1-5'] ? prev['1-5'] + 1 : 1;
  if (curr > 5 && curr <= 8) prev['6-8'] = prev['6-8'] ? prev['6-8'] + 1 : 1;
  if (curr > 8 && curr <= 10) prev['9-10'] = prev['9-10'] ? prev['9-10'] + 1 : 1;
  return prev;
}, {});

console.log(res);

mi soluci贸n:

const rta= array.reduce((obj,item)=>{
    if (item>=1 && item<=5) {
        obj["1-5"]++
    }else if (item>=6 && item<=8) {
        obj["6-8"]++       
    }else if (item>=9 && item<=10){
        obj["9-10"]++       
    }  
    return obj;
},{
    "1-5":0,
    "6-8": 0,
    "9-10": 0,
})

As铆 hice el ejercicio:

const rta = items.reduce((obj, item) => {
  switch (item) {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
      if (!obj["1 - 5"]) {
        obj["1 - 5"] = 1;
        return obj;
      } else {
        obj["1 - 5"] = obj["1 - 5"] + 1;
        return obj;
      }
    case 6:
    case 7:
    case 8:
      if (!obj["6 - 8"]) {
        obj["6 - 8"] = 1;
        return obj;
      } else {
        obj["6 - 8"] = obj["6 - 8"] + 1;
        return obj;
      }
    case 9:
    case 10:
      if (!obj["9 - 10"]) {
        obj["9 - 10"] = 1;
        return obj;
      } else {
        obj["9 - 10"] = obj["9 - 10"] + 1;
        return obj;
      }
  }
}, {});

Lo hice con Switch pero creo que lo aploqu茅 mal, adem谩s de que podria haber hecho una funci贸n entre cada caso ya sino repito el mismo c贸digo. (DRY)

const numeros = [1,2,6,4,3,8,9,7,5,4,22,1,0,3,8,4,3,2];

const rangeNumber = numeros.reduce((range, item)=>{
    if(item>1 && item<=5){
        range['1-5']++;

    }else if(item>5 && item<=8){
        range['6-8']++;
    }else if(item>8 && item<=10){
        range['9-10']++;
    }
    return range;
},{'1-5':0,'6-8':0,'9-10':0})

console.log(rangeNumber);

Yo probe resolverlo usando el reduce + forEach. Les adjunto la respuesta por si a alguien le sirve:

// Inventamos una cantidad de numeros a agrupar por rangos
const numbers = [0, 8, 9, 4, 8, 5, 2, 7, 4, 3, 1, 2];

//Inentamos los rangos a nuestro antojo
let rangosOriginal = [
{inicio:0,
final: 3,
cantidad:0},  // Deberia dar 5

{inicio:4,
final:7,
cantidad:0},  // Deberia dar 4

{inicio: 8,
final: 9,
cantidad:0}   //Deberia dar 3
];

//Analizamos el array numbers
let respuesta = numbers.reduce(function(rangosAcumulado, elementoActual){
    rangosAcumulado.forEach(function(rangosAcumulado){
        if (rangosAcumulado.inicio <= elementoActual && elementoActual <= rangosAcumulado.final) {
            rangosAcumulado.cantidad++;
        }
    });
return rangosAcumulado;
}, rangosOriginal);

console.log(respuesta);

馃槷 Reduce es muy poderoso, algo que me sirvio para entenderlo mejor como funciona el reduce fue poner el debugger y verlo en el navegador el codigo 馃槂

const numbers = [1, 3, 2, 3, 10,20,10];

const resultado = numbers.reduce((obj, numbers) =>{
   //estado inicial
   //si dentro del objeto ya existe ese numero,
   if(!obj[numbers]){
      //si no existe inicializalo en 1
      obj[numbers] = 1;
   } else {
       //obtenemos ese elemento en el contador que este + 1
       obj[numbers] = obj[numbers] + 1;
   }
   debugger;
   return obj;
},{});
// De todo un array lo redujimos a un solo objeto
console.log('Resultado', resultado);

Mi soluci贸n al reto

 const numbers = [1, 2, 3, 4, 5, 1, 6, 7, 2, 3, 8, 7, 9, 4, 10, 6, 4, 3, 7, 9, 1, 5]
  
  const numbersSimplified = numbers.reduce((obj, element)=>{
    if(element == 1 || element == 2 || element == 3 || element == 4 || element ==5){
        obj["1-5"] = obj["1-5"] + 1;
    }
    else if(element == 6 || element == 7 || element == 8){
        obj["6-8"] = obj["6-8"] + 1;
    }
    else if (element == 9 || element == 10) {
        obj["9-10"] = obj["9-10"] + 1;
    } 
    return obj
  }, {"1-5": 0, "6-8":0, "9-10": 0})

Mi soluci贸n:

const num = [1,1,1,1,1,2,2,3,3,3,4,5,6,7,7,7,8,8,9,9,10];

const red = num.reduce((obj, item) => {
    if (item > 0 && item < 11) {
        if (item < 6) {
            obj["1-5"] += 1;
        }
        if (item > 5 && item < 9) {
            obj["6-8"] += 1; 
        }
        if (item > 8) {
            obj["9-10"] += 1;
        }
    }
    return obj;
}, {"1-5" : 0, "6-8" : 0, "9-10" : 0});

console.log(red);

Mi soluci贸n:
const items = [1,2,3,4,5,6,7,8,9,10];
const rta = items.reduce((obj, item) => {
if(item >= 1 && item <= 5){
obj[鈥1-10鈥漖 = obj[鈥1-10鈥漖 + 1
}
else if(item >= 6 && item <= 8){
obj[鈥6-8鈥漖 = obj[鈥6-8鈥漖 + 1
}
else if(item >= 9 && item <= 10){
obj[鈥9-10鈥漖 = obj[鈥9-10鈥漖+ 1
}
return obj;
}, {
鈥1-10鈥: 0,
鈥6-8鈥: 0,
鈥9-10鈥: 0
});

console.log(rta);

Map, Filter y Reduce son los metodos mas importantes y usados en el manejo de arrays

Reduce es el metodo que se hace un poco complejo de entender, pero con el profesor nicolas se entiende como funciona reduce

Mi soluci贸n:

const challenge = [1,3,2,3,7,7,10,6,5,3,8,9,6,8,7,2,3,10,1,9,10]
const rta3 = challenge.reduce((obj, item) => {
  if (item<=5) {
    obj["1-5"]++
  } else if (item<=8) {
    obj["6-8"]++
  } else {
    obj["9-10"]++
  }
  return obj
}, {
  "1-5":0,
  "6-8":0,
  "9-10":0
})

console.log('challenge', rta3);

Esta fue mi soluci贸n


const numbers = [1, 2, 5, 6, 2, 9, 7, 6, 3, 5, 9, 1, 6, 8, 4, 7, 3];
const ranges = {
                 "1-4":0,
                 "5-6":0,
                 "7-9":0
                };

const numbersRanges = numbers.reduce( (obj, item) => {
    if(item <= 4){
        obj["1-4"] += 1
    }
    else if(item >= 5 && item <=6){
        obj["5-6"] += 1; 
    }
    else if(item >= 7 && item <=9){
        obj["7-9"] += 1;
    }
    return obj;
}, ranges);

console.log(numbersRanges);

aca mi aporte usando filter a lo pro 馃槂

const clases = [[0,10],[11,20],[21,30]]

const A = [1,1,5,6,9,8,5,6,16,25];


const R = clases.reduce((obj,item)=>{

    const b = A.filter(item2 => item2>= item[0] &&  item2<= item[1]);
    // console.log(b);
    obj[item] = b.length;
    return obj;
},{});

console.log(R)

este es mi soluci贸n al reto

const rta = lista.reduce((obj, item) => {
    if(item <= 3){obj['1-3'] += 1}
    else if(item >= 4 && item <= 6){obj['4-6'] += 1}
    else{obj['7-9'] += 1};
    return obj;
},{
    '1-3' : 0,
    '4-6' : 0,
    '7-9' : 0,
});

console.log(rta);
const values = [];

for (let i = 0; i <= 100; i++) {
  values.push(Math.floor(Math.random() * 10 + 1));
}

const initialState = {
  '1-5': 0,
  '6-8': 0,
  '9-10': 0,
};

const frequency = values.reduce((acc, curr) => {
  if (curr < 6) {
    acc['1-5'] = acc['1-5'] + 1;
  } else if (curr < 9) {
    acc['6-8'] = acc['6-8'] + 1;
  } else {
    acc['9-10'] = acc['9-10'] + 1;
  }

  return acc;
}, initialState);

console.log(values);
console.log(frequency);

Lo hice para que en base a la nota que tenga (del 1 al 10) se lo clasifique en bajo nivel, nivel, nivel mas y sobrenivel.

Aqu铆 esta mi respuesta 馃槃

const array = [1,5,4,6,8,9,1,2,3,1,9,7,5,6]

const result = array.reduce((resObj, element)=>{
    if(element >=9)
        resObj["9-10"]+=1;
    else if(element>=6) 
        resObj["6-8"]+=1;
    else
        resObj["1-5"]+=1;

    return resObj;
},{
    '9-10':0,
    '6-8': 0,
    '1-5': 0,
})

console.log(result);

Soluci贸n al Reto

const numbers = [1,1,2,6,8,9,4,2,10,5,10,9,8,7,5,2,3,6,5,4,7,8,62]; //Dej茅 este 煤ltimo valor a prop贸sito

const count = numbers.reduce((acum, value) => {

    
    if(value>=1 && value<=5)
    {
        acum["1-5"] += 1;
        

    }
    else
    {
        if(value>=6 && value<=8)
        {
            acum["6-8"] +=1;
            
        }
        else
        {
            if(value>=9 && value>=10)
            {
                acum["9-10"] +=1;
                
            }
        }
    }

    return acum;

}, {

    ["1-5"]:0,
    ["6-8"]:0,
    ["9-10"]:0,

})

console.log(count);

Tuve que inicializar los atributos del objeto acum porque con solo decirle a recude() que el par谩metro acumulador es un objeto, no es suficiente; ya que cuando vamos a asignar valores a un atributo este se encuentra con el valor undefined y no es posible operar con 茅l, los resultados ser铆an NaN.

En el arreglo dej茅 un valor que no estaba en ning煤n rango para verificar que funcione solo con los rangos establecidos y que si en el arreglo hay n煤meros superiores y/o inferiores a los rangos, que sean omitidos gracias a las condiciones espec铆ficas del if else.

const numbers= []

while (numbers.length < 50) {
    numbers.push(Math.floor(Math.random()* (1, 10)) + 1);
};
const numberRanks = numbers.reduce((obj, item) => {
    if (item < 6 ) {obj['1-5'] = obj['1-5'] + 1; }
    else if (item >= 6 & item < 9 ) {obj['6-8'] = obj['6-8'] + 1; }
    else { obj['9-10'] = obj['9-10'] + 1; }
    return obj;
},{
    '1-5': 0,
    '6-8':0,
    '9-10': 0 
})
console.log(numberRanks); 

Mi soluci贸n 馃榿

const data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

const intervals = [ [1,5], [6,10], [11,15] ]

const result = data.reduce((obj, item) => {
    intervals.map(interval => {
        const min = Math.min(...interval)
        const max = Math.max(...interval)

        if (item >= min && item <= max) {
            if(!obj[`${min}:${max}`]) {
                obj[`${min}:${max}`] = 1
            } else {
                obj[`${min}:${max}`]++
            }
        }
    })
    return obj
},{})

Iteraciones de ejemplo

Esta es mi soluci贸n.

const numbers = [1, 2, 3, 5, 6, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 1, 3, 2, 2, 10, 8, 9, 9];

const numbersPerRank = numbers
.reduce((acum, item) => {
    if(item <= 5) {
        if(!acum["1-5"]) {
            acum["1-5"] = 1;
        } else {
            acum["1-5"] = acum["1-5"] + 1;
        }
    }
    else if(item >= 6 && item <= 8) {
        if(!acum["6-8"]) {
            acum["6-8"] = 1;
        } else {
            acum["6-8"] = acum["6-8"] + 1;
        }
    }
    else if(item === 9 || item === 10) {
        if(!acum["9-10"]) {
            acum["9-10"] = 1;
        } else {
            acum["9-10"] = acum["9-10"] + 1;
        }
    }
    return acum
}, {})

console.log(numbersPerRank) // { '1-5': 12, '6-8': 6, '9-10': 5 }