【问题标题】:Loop to get data from a table results in NaN allocated inside array in javascript循环从表中获取数据导致在javascript中分配在数组内部的NaN
【发布时间】:2016-11-28 06:57:18
【问题描述】:

我正在尝试从动态表中获取输入(即数字),特别是底部的“demanda”行。 Here you can get a visual representation of what I'm talking about.

为此,我想出了下面的代码,其中 z=0 和 x=1 在进入循环之前,数组 b[] 的长度是 m 的值(这与动态桌子)。问题是,当我从我不知道它来自哪里的 console.log 中看到值时,这会导致 NaN(这是不需要的)。

这里是完整的Js代码:

var inicio = function () {
    var getDatos = function () {
        var rows = parseInt($("#rows").val());
        var cols = parseInt($("#cols").val());
        rows = rows + 1;
        cols = cols + 1;
        var r1 = 1;
        var numero = 1;
        var num = 1;
        var renglones = "<table class='centered bordered'><thead><tr><th data-field='no'></th>";
        while (rows >= r1) {
            var c1 = cols;
            var c2 = cols + 2;
            if (r1 == 1) {
                var letra = 65;
                var valor = 2;
                while (c1 > 0) {
                    if (c1 == 1) {
                        renglones = renglones.concat("<th data-field=titulo'" + valor + "'>Oferta</th>");
                        c1--;
                    }
                    else {
                        renglones = renglones.concat("<th data-field=titulo'" + valor + "'>" + String.fromCharCode(letra) + "</th>");
                        letra++;
                        valor++;
                        c1--;
                    }
                }
                renglones = renglones.concat("</tr></thead><tbody>");
            }
            renglones = renglones.concat("<tr>");
            while (c2 > 0) {

                if (c2 == (cols + 2)) {

                    if (r1 == rows) {
                        renglones = renglones.concat("<td>Demanda</td>");
                        c2--;
                    }
                    else {
                        renglones = renglones.concat("<td>" + num + "</td>");
                        num++;
                        c2--;
                    }

                }
                else if (c2 == 1) {
                    renglones = renglones.concat("</tr>");
                    c2--;
                }

                else if (c2 == 2 && r1 == rows) {
                    renglones = renglones.concat("<td></td>");
                    c2--;
                }

                else {
                    renglones = renglones.concat("<td><input  id='caja" + numero + "' type='number' class='validate'></td>");
                    c2--;
                    numero++;
                }

            }
            if (r1 == rows) {
                renglones = renglones.concat("</tbody> </table>");

            }

            r1++;
        }
        renglones = renglones.concat("<div class='row'><div class='col s12 center'><a class='waves-effect waves-light btn ' id='btnAceptar'>Aceptar</a></div></div>");

        $("#divTabla").html(renglones);
        $("#divTabla #btnAceptar").on("click", metodoEsn);
    };

    var metodoEsn = function () {
        var m = parseInt($("#rows").val());//renglones
        var n = parseInt($("#cols").val());//columnas
        var tp = new Array(m + 1);
        var allo = new Array(m + 1);
        var x = 1;
        var z = 0;
        var a = new Array(m + 1);//5
        var b = new Array(n + 1);
        //int tp[][]= new int[5][5];
        var k = 1, count = 0;
        var tc = 0, mult = 1, sum = 0;
        var i, j;
        var c_sum = 0, d_sum = 0;

        for (i = 1; i <= m; i++) {
            //se crean las columnas de la tabla
            tp[i] = new Array(n + 1);
            console.log("se creo la columna numero " + i);
        }
        for (i = 1; i <= m; i++) {
            allo[i] = new Array(n + 1);
            console.log("se creo la columna numero " + i + "de allo");
        }

        //Se ingresan los valores de la tabla
        for (i = 1; i <= m; i++) {
            for (j = 1; j <= n; j++) {

                tp[i][j] = parseInt($("#caja" + x).val());
                allo[i][j] = 0;
                console.log("se ingresa el valor de la caja " + i + " " + j);
                x++;
            }
        }
        x = 0;

        //Ingresa Oferta
        for (i = 1; i <= m; i++) {
            x += n + 1;
            a[i] = parseInt($("#caja" + x).val());
            c_sum += a[i];
            console.log("se ingresa la caja" + a[i]);
        }

        x = 1;
        console.log("valor " + c_sum);
        //Ingresa Demanda
        console.log("se ingresa la demanda");

        for (i = 1; i <= n; i++) {
            x += m + 2;
            z++;
            if (z == m) {
                for (k = 1; k < n + 2; k++) {
                    x++;
                    b[k] = parseInt($("#caja" + x).val());
                    d_sum += b[k];
                    console.log("se ingresa el valor de la caja " + k);
                }
                break;
            }
        }
        console.log("valor " + d_sum);

        for (i = 1; i <= b.length; i++) {
            console.log(b[i]);
        }

        console.log("se inician las cuentas de esn");

        if (c_sum == d_sum) {
            for (i = 1; i <= m; i++) {
                console.log("todo bien");
                for (j = k; j <= n; j++) {
                    console.log("todo bien x2");
                    if (a[i] > b[j]) {
                        console.log("todo bien x3");
                        mult = tp[i][j];
                        mult = mult * b[j];
                        allo[i][j] = b[j];
                        a[i] = a[i] - b[j];
                        sum += mult;
                        mult = 1;
                        count++;
                        console.log("por aqui todo bien");
                        //k=1;

                    } else {
                        mult = tp[i][j];
                        mult *= a[i];
                        allo[i][j] = a[i];
                        b[j] = b[j] - a[i];
                        sum += mult;
                        mult = 1;
                        k = j;
                        count++;
                        console.log("por aqui tambien");
                        break;
                    }
                }
            }
            console.log("se termino de hacer el metodo");

            var tabla = "<table class='centered bordered'>";
            tabla = tabla.concat("<table> <tbody>");
            for (i = 1; i <= m; i++) {
                tabla = tabla.concat("<tr>");
                for (j = 1; j <= n; j++) {
                    tabla = tabla.concat("<td>" + allo[j][i] + "</td>");

                }
                tabla = tabla.concat("</tr>");
            }
            tabla = tabla.concat("</tbody> </table>");

            $("#divTabla2").html(tabla);
            console.log("se despliega la tabla");

            if ((m + n - 1) == count)
                console.log("Z es igual a: " + sum);
            else {
                console.log("La solucion de este problema no se puede encontrar");
            }


        }

    };

    $("#btnCrear").on("click", getDatos);

发布的 HTML 代码:

<!DOCTYPE html>
<html lang="en">
<head>
<link type="text/css" rel="stylesheet" href="css/materialize.css"        media="screen,projection"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>Problemas de transporte: Metodo Esquina Superior Noroeste.</title>
</head>
<body>
<div class="container">
    <h5>Problemas de transporte: Metodo Esquina Superior Noroeste.</h5>
    ESN?
    <P>Primero que nada, que es el metodo de ESN?<br> El método de la esquina Noroeste es un algoritmo heurístico capaz de solucionar problemas de transporte o distribución mediante la consecución de una solución básica inicial que satisfaga todas las restricciones existentes sin que esto implique que se alcance el costo óptimo total. </p>
        <br>

        <h6>Calcular</h6>
        <div class="input-field col s6">
            <input id="rows" type="number" class="validate">
            <label for="rows">Origenes</label>
        </div>
        <div class="input-field col s6">
            <input id="cols" type="number" class="validate">
            <label for="cols">Destinos</label>
        </div>
        <br>
        <div class="row">
            <div class="col s12 center"><a class="waves-effect waves-light btn " id="btnCrear">Crear</a></div>
        </div>

</div>
<div class="divider"></div>
<div id="divTabla"></div>
<div id="divTabla2"></div>
    <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
    <script type="text/javascript" src="js/materialize.js"></script>
    <script type="text/javascript" src="js/index.js"></script>
</body>
</html>

【问题讨论】:

  • 这里break;有什么用
  • 请发布您的html代码
  • 马上添加。
  • 我想在完成将数据放入数组后使用 break 跳过外循环。
  • 与 NaN 相关的错误最明显的地方是b[k]=parseInt($("#caja"+x).val()); x 的初始值在提供的 sn-p 中是未知的。 #caja... 也没有出现在 sn-p 中,这可能是由于您提到的表格的动态性质。 .val()) 调用可能没有返回整数。除此之外,我们需要一个更完整的代码示例来提供进一步的指导,例如演示问题的简单小提琴,或者至少有足够的代码可以重现并因此调试问题。 stackoverflow.com/help/mcve

标签: javascript html arrays loops


【解决方案1】:

(代表 OP 发布)

我已修复它,代码在第 227 行仍然出现“未捕获类型错误:无法读取未定义 1 的属性”的错误,但我自己会弄清楚;如果有人感兴趣,我将“for”循环更改为“while”,如下所示:

//Ingresa Demanda
            console.log("se ingresa la demanda");
            var tope=(1+n)*(1+m);
            tope=tope-1;
            while(x!=tope){
                x++
                if(x>=tope-(n-1)){
                z++;
                b[z]=parseInt($("#caja"+x).val());
                d_sum+=b[z];
                }
            }
            console.log("valor"+d_sum);

似乎问题出在有人所说的循环上,所以我尝试更改它。

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2021-08-29
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多