No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Static

11/25
Recursos

Aportes 33

Preguntas 2

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

solo no inicializar el max

numbers.reduce((max, item) => max > item ? max : item);

脡sta ha sido mi solucion al reto鈥

La soluci贸n es simplemente no pasar el segundo parametro del reduce.

El primer parametro del reduce es el callback donde se ejecuta la operaci贸n del reduce y el segundo es un parametro opcional que indica el valor inicial del acumulador, por defecto, el valor inicial del acumulador es la primera posici贸n del array y curr empezar铆a desde la siguiente posici贸n.

static max(...numbers: number[]) {
    return numbers.reduce((acc, curr) => acc > curr ? acc : curr);
}

Infinitas formas de hacer los mismo鈥

  static max(...numbers: number[]) {
    return numbers.reduce((max, item) => max >= item ? max: item, -Infinity);
  }

Ejemplos de situaciones de la vida real donde tendr铆amos miembros est谩ticos
De momento as铆 dicho queda un tanto abstracto. Pero antes de ponerse con ejemplos concretos de programaci贸n donde hablemos de la utilidad pr谩ctica de los miembros est谩ticos sea bueno tratar de explicar estos conceptos un con situaciones de la vida real.

Por ejemplo, pensemos en los autobuses de tu ciudad. No s茅 si es el caso, pero generalmente en Espa帽a todos los autobuses metropolitanos tienen la misma tarifa. Yo podr铆a definir como un atributo de la clase Autob煤sMetropolitano su precio. En condiciones normales, para acceder al precio de un autob煤s necesitar铆a instanciar un objeto autob煤s y luego consultar su precio. 驴Es esto pr谩ctico? quiz谩s solo quiero saber su precio para salir de casa con dinero suficiente para pagarlo, pero en el caso de un atributo normal necesariamente deber铆a tener instanciado un autob煤s para preguntar su precio.

Pensemos en el n煤mero 鈥淧i鈥. Sabemos que necesitamos ese n煤mero para realizar c谩lculos con circunferencias. Podr铆a tener la clase Circunferencia y definir como atributo el n煤mero Pi. Sin embargo, igual necesito ese n煤mero para otra cosa, como pasar 谩ngulos de valores de grados a radianes. En ese caso, en condiciones normales sin atributos de clase, necesitar铆a instanciar cualquier c铆rculo para luego preguntarle por el valor de 鈥淧i鈥. De nuevo, no parece muy pr谩ctico.

Nota: Ojo, porque en el caso del n煤mero Pi, su valor ser谩 siempre constante. Podr铆amos en esa caso usar constantes si nuestro lenguaje las tiene, pero los atributos est谩ticos no tienen por qu茅 ser siempre un valor invariable, como es el caso del precio de los AutobusesMetropolitanos, que sube cada a帽o.
Con esos tenemos dos ejemplos de situaciones en las que me pueden venir bien tener atributos 鈥渟tatic鈥, o de clase, porque me permitir铆an consultar esos datos sin necesidad de tener una instancia de un objeto de esa clase.

En cuanto a m茅todos, pensemos por ejemplo en la clase Fecha. Puedo intentar construir fechas con un d铆a, un mes y un a帽o, pero puede que no necesite una fecha en un momento dado y solo quiera saber si una fecha podr铆a ser v谩lida. En situaciones normales deber铆a intentar construir esa fecha y esperar a ver si el constructor me arroja un error o si la fecha que construye es v谩lida. Quiz谩s ser铆a m谩s c贸modo tener un m茅todo vinculado a la clase, en el que podr铆a pasarle un mes, un d铆a y un a帽o y que me diga si son v谩lidos o no.

Los miembros de una clase son las propiedades y los m茅todos. Cuando creamos un objeto, ese objeto realiza una copia de todos los miembros(propiedades y m茅todos que no sean est谩ticos). Los miembros est谩ticos s贸lo le pertenecen a la clase y no al objeto.

class MyMath {
  public static PI:number = 3.14;
  private static getNumber():number{
    return this.PI;
  }
}

const nerd = new MyMath();
//El objeto no puede acceder a las propiedades est谩ticas de la clase
nerd.PI //error, esta propiedad es est谩tica
//La Clase:
MyMath.PI; //permite acceder a esta propiedad
MyMath.getNumber(); //No puede ser accedido porque aunque es static es private

Mi solucion es esta:

 static max(...numbers: number[]){
    console.log(numbers);
    return numbers.reduce((max, item)=> max >= item ? max: item, -Infinity)
  }

La definici贸n formal de los elementos est谩ticos (o miembros de clase) nos dice que son aquellos que pertenecen a la clase, en lugar de pertenecer a un objeto en particular. Recuperando concetos b谩sicos de orientaci贸n a objetos, sabemos que tenemos:

Clases: definiciones de elementos de un tipo homog茅neo.
Objetos: concreci贸n de un ejemplar de una clase.
En las clases defines que tal objeto tendr谩 tales atributos y tales m茅todos, sin embargo, para acceder a ellos o darles valores necesitas construir objetos de esa clase. Por ejemplo, una casa tendr谩 un n煤mero de puertas para entrar, en la clase tendr谩s definida que una de las caracter铆sticas de la casa es el n煤mero de puertas, pero solo concretar谩s ese n煤mero cuando construyas objetos de la clase casa. Un coche tiene un color, pero en la clase solo dices que existir谩 un color y hasta que no construyas coches no les asignar谩s un color en concreto. En la clase cuadrado definir谩s que el c谩lculo del 谩rea es el 鈥渓ado elevado a dos鈥, pero para calcular el 谩rea de un cuadrado necesitas tener un objeto de esa clase y pedirle que te devuelva su 谩rea.

Ese es el comportamiento normal de los miembros de clase. Sin embargo, los elementos est谩ticos o miembros de clase son un poco distintos. Son elementos que existen dentro de la propia clase y para acceder los cuales no necesitamos haber creado ning煤n objeto de esa clase. Osea, en vez de acceder a trav茅s de un objeto, accedemos a trav茅s del nombre de la clase.

Si reduce tiene definido un valor inicial (el segundo par谩metro que recibe reduce), la funci贸n reductora va a tomar este segundo par谩metro como primer argumento en la primera llamada de la funci贸n callback.
Si dejamos el 0 en nuestra funci贸n max, al ser procesado por el reduce, cuando reciba valores negativos siempre tomar谩 dicho valor cero, pues seria el valor inicial.

class MyMath {
  static readonly PI = 3.14;

// Static nos permite hacer un llamado de los valores dentro de la clase sin la necesidad de una instancia

  static max(...numbers: number[]) {
    return numbers.reduce(
	(max,item) => max >= item ? max : item
    );
  }
}

Mi respuesta, usando el 煤ltimo elemento en lugar del primero:

static max(...numbers: number[]) {
    return numbers.reduce((max, item) => max >= item ? max : item, numbers[numbers.length - 1]);
  }

Lo raro es que se me olvid贸 poner el -1 en el 煤ltimo arreglo, y de todas maneras funcion贸, la parecer tambi茅n funciona cuando el valor de comparaci贸n es 鈥渦ndefinded鈥.

se puede iniciar con el primer valor del array

menudo triple me he pegado ajajajjajaja digo, voy a probar... he cambiado el 0 por +-Infinity y ha funcionado , no sabia si habia alguna manera de meter el infinito pero he puesto inf y me ha salido la variable Infinity.
Mi soluci贸n al reto no usa reduce, prefer铆 hacerlo con un for para que fuera m谩s claro lo que sucede: ```js static max(...values: number[]): number { let max = values[0]; // Assume the first value is the largest for (const value of values) { if (value > max) max = value; } return max; } ```
Usar el initialValue como: Number.NEGATIVE\_INFINITY es un valor especial que representa el l铆mite inferior de los n煤meros en JavaScript. Garantiza que cualquier valor num茅rico en el array ser谩 considerado m谩s grande que este valor.

Lo hice pero primero orden茅 el arreglo y retorn茅 el 煤ltimo elemento:

  public static max(...values: number[]): number {
    return values.sort((a, b) => a - b)[values.length - 1];
  }
class MyMath {
  static readonly PI = 3.14; // con static puedo usarlo como javascript lo usa normal, yt con readonly evito el cambio despues

  static max (...numbers: number[]) {
    console.log(numbers);
    return numbers.reduce((max, item)=> max >= item ? max: item, numbers[0]);
  }

}

initial es el primer valor del array y current el segundo, luego el reduce ir谩 iterando y movi茅ndose.

static max(...numbers:number[]){
    return numbers.reduce((initial, current)=>{
      return initial >= current ? initial : current;
    });
}

console.log(MyMath.max(-5, -2, -20)) //-2

Lo resolv铆 de la siguiente manera:

static max(...numbers: number[]) {
    return numbers.reduce((max, item) =>
      (max >= item) ? max : item,
      numbers.length == 0 ? 'Ingresa al menos un n煤mero' : -Infinity
    );
  }

Yo us茅 sort() para max, donde devuelvo el primer valor del nuevo array que ser铆a el mayor, aunque reduce() es m谩s eficiente en cuanto a rendimiento, pero sort fue lo primero que se me ocurri贸:

static max(...args: number[]) {
	return args.sort((a, b) => b - a)[0];
}

Mi solucion fue esta

numbers.sort((a,b) => a - b);
return numbers[numbers.length - 1];

Mi solucion al reto:

  static max(...numbers: number[]) {
    let maxNum = numbers[0]

    for (let i = 0; i < numbers.length; i++) {
      if (numbers[i] > maxNum) {
        maxNum = numbers[i]
      }
    }
    return maxNum
  }

Paso otra forma de resolverlo, me pareci贸 bastante ingeniosa:

static max(...numbers: number[]): number {
    try {
      numbers.sort((a: number, b: number) => {
        return b - a;
      });
    } catch {
      throw 'Error calculate max number'
    }
   return numbers[0];
  }
}

return numbers.reduce((max,item) => max >= item ? max:item);
Quitarle el punto de comparaci贸n 馃槂

Buenas tardes,

comparto reto:

    static max(...numbers: number[]) {
        return numbers.reduce((max, item) => max >= item ? max : item);
    }

se le quita la variable inicial ya que por defecto el toma el primer elemento del array enviado.

return numbers.reduce((max, item) => max >= item ? max : item, numbers[0]);

Asi es como hace las clases java :0

Reto

static max (...number: number[]){
        return number.reduce((max,item) => max >= item ? max: item, number[0] );
    }

mi solucion:

static max(...numbers: number[]){
        return numbers.sort((a,b)=>{return b - a})[0];
    }

Mi reto 鈥 defines el valor minimo con reduce y lo usas para el siguiente reduce.

Pero vi la solucion de Paul, es bastante mas simple aunque no entiendo como funciona el reduce a esa profundad

 max(...numbers: number[]): number {
        const minValue = numbers.reduce((min, item) => min <= item ? min : item, 0)
        return numbers.reduce((max, item) => max >= item ? max : item, minValue)
    }

El problema est谩 en que la variable max, se est谩 inciiando en 0, por lo que 0 siempre ser谩 mayor que cualquier n煤mero negativo. En este caso habr铆a que iniciar la variable ya sea con el valor de la primera posici贸n o el de la 煤ltima;

profe esta mal usar otro reducer?

static max(...numbers: number[]) {
    return numbers.reduce(
      (max, item) => (max >= item ? max : item),
      numbers.reduce((a, b) => (a <= b ? a : b))
    );
  }

Una manera usando el sort

static max(...numbers: number[]) {
  return numbers.sort((a, b) => b - a)[0]
}

Mi solucion al reto

static max(...numbers: number[]) {
    return numbers.reduce((max, i) => (i > max ? i : max), numbers[0]);
}