1

Hola comunidad espero me puedan ayudar con este problema e antemano muchas gracias por su ayuda.

Tengo un json que se muestra abajo.

Ahora a un input text le agrego un valor de mi arreglo en este caso la posición 5 que es este "$ 80.50";

¿Como puedo hacer un replace a ese input para quitarle el simbolo de pesos? ya que en mi codigo me marca un error en la consola:

El input es un control html.

Gracias por su ayuda.

 var col_detalle_subgrid = [{"Metrica":"Prom 1", "Costo":null, "Oferta":null, "Bono1":null, "Bono2":null, "Pago":"$ 80.50"},{"Metrica":"Prom 2", "Costo":null, "Oferta":null, "Bono1":null, "Bono2":null, "Pago":"$ 30.50"}];
 
 // Aqui declaro mi arreglo para llenarlo con los datos del json
 var arreglo_promo1= [];
 var arreglo_promo2= [];
 
 
 // Aqui recorro cada uno de los json 
 
 for (var i in col_detalle_subgrid) {
  for (var j in col_detalle_subgrid[i]) {
  
  // Hago una comparacion de los elementos del json
    if (col_detalle_subgrid[i][j] == "Prom 1") { 
    
    // Si la comparacion es correcta hago visible un Tab
      $("#Prom1").css("display", "inline-block"); 
      
      // Vuelvo a recorrer el json y lleno mi arreglo;
      $.each(col_detalle_subgrid[i], function(k, v) {
         arreglo_promo1.push(v);                                        
        });

    }
    else if (col_detalle_subgrid[i][j] == "Prom 2") {
    
      $("#Prom2").css("display", "inline-block");
       $.each(col_detalle_subgrid[i], function(k, v) {
         arreglo_promo2.push(v);                                        
        });

    }
   
  }

}


    //Fuera del for lleno mi input pero me marca error

$("#txtPromo1").val(arreglo_promo[5]) === undefined || $("#txtPromo1").val(arreglo_promo[5]) === null ? $("#txtPromo1").val(arreglo_promo[5]) : $("#txtPromo1").val(arreglo_promo[5].replace('$', ' ').trim());
  

 //Error en consola
 
 Uncaught TypeError: Cannot read property 'replace' of null
 
SHINOBI
  • 499
  • 5
  • 22
  • ¿Donde declaras la variable? ¿Esta dentro del [scope](https://medium.com/@sergiodxa/definiendo-conceptos-closure-y-scope-en-javascript-9081f1e113e6)? – x3k Jun 06 '19 at 12:52

1 Answers1

2

Como te he puesto en el comentario, tu fallo no es otro que el scope de la variable. Tienes que tener en cuenta que si declaras la variable dentro de una función, no estará disponible fuera de ella.

Información respecto a los scopes:

También puedes aprender un poco mas de los tipos de variables y del uso de ellas con esta pregunta: var/let/const y sus contextos

EDIT despues de edicion del OP:

Conclusion:

Fallo sintáctico o scopes

Demostración que el código es valido:

 var col_detalle_subgrid = [{"Metrica":"Prom 1", "Costo":null, "Oferta":null, "Bono1":null, "Bono2":null, "Pago":"$ 80.50"},{"Metrica":"Prom 2", "Costo":null, "Oferta":null, "Bono1":null, "Bono2":null, "Pago":"$ 30.50"}];
 
 // Aqui declaro mi arreglo para llenarlo con los datos del json
 var arreglo_promo1= [];
 var arreglo_promo2= [];
 
 
 // Aqui recorro cada uno de los json 
 
 for (var i in col_detalle_subgrid) {
  for (var j in col_detalle_subgrid[i]) {
  
  // Hago una comparacion de los elementos del json
    if (col_detalle_subgrid[i][j] == "Prom 1") { 
    
    // Si la comparacion es correcta hago visible un Tab
      $("#Prom1").css("display", "inline-block"); 
      
      // Vuelvo a recorrer el json y lleno mi arreglo;
      $.each(col_detalle_subgrid[i], function(k, v) {
         arreglo_promo1.push(v);                                        
        });

    }
    else if (col_detalle_subgrid[i][j] == "Prom 2") {
    
      $("#Prom2").css("display", "inline-block");
       $.each(col_detalle_subgrid[i], function(k, v) {
         arreglo_promo2.push(v);                                        
        });

    }
   
  }

}


    //Fuera del for lleno mi input pero me marca error

$("#txtPromo1").val(arreglo_promo1[5]) === undefined || $("#txtPromo1").val(arreglo_promo1[5]) === null ? $("#txtPromo1").val(arreglo_promo1[5]) : $("#txtPromo1").val(arreglo_promo1[5].replace('$', ' ').trim());
  
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" id="txtPromo1">
x3k
  • 3,732
  • 10
  • 38
  • Hola @Parra mi arreglo esta en la misma función posteriormente hago dos for y lleno mi arreglo fuera de los dos bucles for lleno mis controles input. y me salta ese error. – SHINOBI Jun 06 '19 at 14:25
  • @SHINOBI Si pones el contexto completo en el código puedo echarte una mano! Parece bastante claro que es problema de los scopes pero sin mas información no sabría decirte. – x3k Jun 06 '19 at 14:30
  • Hola @Parra ya he editado el código y lo coloque completo espero me puedas ayudar gracias. – SHINOBI Jun 06 '19 at 14:52
  • Muchas gracias @Parra pero puede haber otra forma de hacerlo ya que no accedo a las keys del json porque estas pueden cambiar de nombre ya que trabajo con columnas dinamicas. He puesto los input dentro de los for y ya me muestra los valores pero no se si esto sea correcto. – SHINOBI Jun 06 '19 at 15:03
  • @SHINOBI, Al final estas llamando a `arreglo_promo` pero arriba solo has declarado `arreglo_promo1` y `arreglo_promo2`. He modificado el snippet con tu codigo entero, y cambiado el `arreglo_promo` por `arreglo_promo2` y funciona, pero claro supongo que lo que quieres es sumar los 2 en 1 solo array, pero no veo donde se declara `arreglo_promo` – x3k Jun 06 '19 at 15:55
  • Hola @Parra te ofrezco una gran disculpa era arreglo_promo1 en lugar de arreglo_promo no verifique eso. Ya verifique que funciona tu código, lo tengo igual que tu y el mio aun me sigue botando el error en consola que raro seguire revisando cuidadosamente. Muchas Gracias. – SHINOBI Jun 06 '19 at 16:08
  • 1
    si tenemos una respuesta de las [funciones de clausura](https://es.stackoverflow.com/questions/607/c%C3%B3mo-funcionan-las-clausuras-en-javascript) – JackNavaRow Jun 06 '19 at 18:21