Tengo la siguiente función que quiero hacer más genérica:

function addRow2(rowData) {
    var row = $("<tr />")
    $("#dataTable").append(row);
    row.append($("<td>" + rowData.param1 + "</td>"));
    row.append($("<td>" + rowData.param2 + "</td>"));
    row.append($("<td>" + rowData.param3 + "</td>"));
}

Intenté el siguiente enfoque:

function addRow1(rowData) {
    var row = $("<tr />")
    $("#dataTable").append(row);
    for (i = 1; i <= 3; i++) {
        var marker = [];
        marker[i] = 'rowData.param'+i;
        alert(marker[i]);
        row.append($("<td>" + marker[i] + "</td>"));
    }
}

Sin embargo, en lugar de los valores de rowData.param1 ... 3 imprime "rowData.param1", "rowData.param1" y "rowData.param1".

3
JoeBlack 11 may. 2016 a las 21:03

3 respuestas

La mejor respuesta

Puede usar la notación de corchetes para acceder a una propiedad de objeto por nombre de cadena como este:

marker[i] = rowData['param' + i];

Como nota al margen, está creando una nueva matriz cada iteración y almacenando el nombre de su propiedad como el elemento i de esa matriz. Podría simplemente usar una variable:

for (i = 1; i <= 3; i++) {
    var marker = rowData['param' + i];
    alert(marker);
    row.append($("<td>" + marker + "</td>"));
}

O una frase:

for (i = 1; i <= 3; i++) {
    row.append($("<td>" + rowData['param' + i] + "</td>"));
}
8
IrkenInvader 11 may. 2016 a las 18:22

Puede usar $.each para obtener todas las propiedades de rawData, de esta manera no tiene que confiar en param1, param2 y usar propiedades de objeto significativas.

function addRow2(rowData) {
    var row = $("<tr />")
    $("#dataTable").append(row);
    $.each(rowData, function (prop, value) {
        row.append($("<td>" + value + "</td>"));
    });
}
0
Marco Scabbiolo 11 may. 2016 a las 18:33

¿Por qué estás creando una matriz? ¿No se puede simplificar su código para:

function addRow1(rowData) {
    var row = $("<tr />")
    $("#dataTable").append(row);
    for (i = 1; i <= 3; i++) {
        row.append($("<td>" + rowData['param' + i] + "</td>"));
    }
}
-1
William Gates 11 may. 2016 a las 18:18