как изменить значение элемента в массиве в цикле for - PullRequest
0 голосов
/ 08 мая 2020

У меня есть следующий массив:

for (let i of lastBal) {
    var amtToDetect = received_amt;

    console.log('amt to detect', amtToDetect);

    var lpcForLoop = i.lpc;
    var lic_fee_for_loop = i.lic_fee;
    var daysDifference_for_loop = i.lpdays;
    var onlineLPC_for_loop = i.onlinelpc;
    var total_amt_for_loop = i.total_amt;

    console.log('lic fee for loop', i.lic_fee);

    if (amtToDetect >= lic_fee_for_loop) {
        var remainAmtAfterLPC = Math.floor(amtToDetect - lpcForLoop);
        var paidLPC = amtToDetect - remainAmtAfterLPC;

        if (remainAmtAfterLPC > 0) {
            if (remainAmtAfterLPC >= lic_fee_for_loop) {
                var remainBalanceAfterLicFee = remainAmtAfterLPC - lic_fee_for_loop
                var paidLicFee = remainAmtAfterLPC - remainBalanceAfterLicFee;
                var total_amt_payment = Math.floor(paidLicFee + lpcForLoop);

                //for balance entry
                var bal_lic_fee = Math.floor(lic_fee_for_loop - paidLicFee);
                var bal_LPC = Math.floor(lpcForLoop - lpcForLoop);
                var bal_total_amt = Math.floor(bal_lic_fee + bal_LPC);
            }
        }

    }

    //console.log('demand in for loop',demandInsertData);

    let difference = paymentDate - lic_fee_due_date;
    var daysDifference = Math.floor(difference / 1000 / 60 / 60 / 24);
    var onlineLPC = Math.floor(lic_fee * 0.18 * daysDifference / 365);
    var currentLPC = Math.floor(onlineLPC + bal_LPC);
    var total_amt = Math.floor(lic_fee + currentLPC);

    console.log('in end for loop');

    i.lpc = onlineLPC;
    i.lic_fee = lic_fee - i.lic_fee;

    console.log('in end for loop lic fee', i.lic_fee);

    i.lpdays = daysDifference;
    i.total_amt = total_amt;
    received_amt = remainBalanceAfterLicFee;

    console.log('in end for loop received_amt', received_amt);
}

В приведенном выше примере l oop я хочу заменить некоторые элементы из массива lastBal.

В конце для l oop я попытался заменить некоторые элементы следующим образом:

i.lic_fee = lic_fee - i.lic_fee;

Однако значения не заменяются во время следующей итерации. Вместо этого назначаются старые значения.

Не могли бы вы помочь мне найти здесь проблему.

Заранее спасибо.

Изменить:

после изменения значений элементов я хочу использовать их так же для l oop. означает, что после 1-го создания для l oop я хочу изменить значения элемента и использовать обновленные значения в следующем создании. здесь в конце l oop значения обновляются, но во втором itreation назначаются старые значения из lastBal.

Edit 2: добавлен lastBal

last bal [ RowDataPacket {
demand_id: 42,
user_id: 4,
lic_id: 4,
description: 'Balance',
demand_start_date: '2020-07-01',
demand_end_date: '2020-09-30',
demand_fin_year: '2020-2021',
lic_fee: 27000,
form_fee: 0,
lic_fee_due_date: '2020-06-30',
lrc: 0,
srtax: 0,
lpc: 1224,
total_amt: 28224,
outstanding_amt: 28224,
lpdays: 92,
onlinelpc: 1224,
flag: 0,
lic_fee_pay_id: 0,
demand_added_date: '2020-04-28 19:43:14',
payment_date: '0000-00-00 00:00:00' },
RowDataPacket {
demand_id: 44,
user_id: 4,
lic_id: 4,
description: 'Balance',
demand_start_date: '2020-10-01',
demand_end_date: '2020-12-31',
demand_fin_year: '2020-2021',
lic_fee: 54000,
form_fee: 0,
lic_fee_due_date: '2020-09-30',
lrc: 0,
srtax: 0,
lpc: 1224,
total_amt: 55224,
outstanding_amt: 55224,
lpdays: 0,
onlinelpc: 0,
flag: 0,
lic_fee_pay_id: 0,
demand_added_date: '2020-04-28 19:52:25',
payment_date: '0000-00-00 00:00:00' } ]

Выше массив извлекается из базы данных. Я хочу обновить 2-й RowDataPacket после 1-й итерации для l oop. Значения для обновленного 2-го RowDataPacket - динамические c.

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Что ж, я попытался воспроизвести с вашим кодом, помещая некоторые образцы значений в поля, где это необходимо, и я вижу ожидаемые изменения. Следовательно, вам необходимо уточнить, где именно вы не видите ожидаемых изменений.

     var lastBal = [{ lpc: 1, lic_fee: 2, lpdays: 9, onlinelpc: 4, total_amt: 2 }, { lpc: 3, lic_fee: 4, lpdays: 2, onlinelpc: 5, total_amt: 1 }];
var editedValues = {};
for (let i of lastBal) {
    if (!(Object.keys(editedValues).length === 0 && editedValues.constructor === Object)) {
        i = {...i, ...editedValues} ;
    }
    var amtToDetect = 5;
    console.log('amt to detect', amtToDetect);
    var lpcForLoop = i.lpc;
    var lic_fee_for_loop = i.lic_fee;
    var daysDifference_for_loop = i.lpdays;
    var onlineLPC_for_loop = i.onlinelpc;
    var total_amt_for_loop = i.total_amt;
    console.log('lic fee for loop', i.lic_fee);
    if (amtToDetect >= lic_fee_for_loop) {
        var remainAmtAfterLPC = Math.floor(amtToDetect - lpcForLoop);
        var paidLPC = amtToDetect - remainAmtAfterLPC;
        if (remainAmtAfterLPC > 0) {
            if (remainAmtAfterLPC >= lic_fee_for_loop) {
                var remainBalanceAfterLicFee = remainAmtAfterLPC - lic_fee_for_loop
                var paidLicFee = remainAmtAfterLPC - remainBalanceAfterLicFee;
                var total_amt_payment = Math.floor(paidLicFee + lpcForLoop);
                //for balance entry
                var bal_lic_fee = Math.floor(lic_fee_for_loop - paidLicFee);
                var bal_LPC = Math.floor(lpcForLoop - lpcForLoop);
                var bal_total_amt = Math.floor(bal_lic_fee + bal_LPC);
            }
        }

    }
    //console.log('demand in for loop',demandInsertData);
    var daysDifference = 5000;
    var onlineLPC = 2000;
    var currentLPC = 1000;
    var total_amt = 1500;
    console.log('in end for loop');
    i.lpc = onlineLPC;
    i.lic_fee = 4000 - i.lic_fee;
    console.log('in end for loop lic fee', i.lic_fee);
    i.lpdays = daysDifference;
    i.total_amt = 7000;
    received_amt = 11000;
    console.log('in end for loop received_amt', received_amt);
    editedValues = {
        pc: onlineLPC,
        lic_fee: lic_fee - i.lic_fee,
        lpdays: daysDifference,
        total_amt: total_amt,
        onlinelpc: onlineLPC,
        received_amt: remainBalanceAfterLicFee
    } // Whatever values you'd like to retain for the subsequent execution
}
console.log(lastBal);

РЕДАКТИРОВАТЬ - обновляется соответствующим образом по мере обновления ваших требований.

0 голосов
/ 08 мая 2020

Потому что вы не обращаетесь к индексу / ключу массива или, в данном случае, к объекту в javascript. Взгляните на приведенный ниже код, я не могу изменить «b на bb», присвоив «bb» переменной отобразить значение в for l oop (ключ). В этом случае key = 'bb' напечатает значение, но не изменит его.

var test = [];
test = ['a','b','c','d','e','f','g','h','i'];
for (let key of test){
    if (key == 'b') { key = 'bb'}
 console.log(key);
}
test[1] = 'cc';
for (let key of test){
 console.log(key);
}

Чтобы изменить значение в объекте / массиве, вам необходимо сослаться на индекс / ключ из оригинала массив. test [1] = 'cc'; , тогда значение будет изменено.

Запустить код, комментируя test [1] = 'cc'; , вы увидите, что значение не изменилось в исходном l oop, затем запустите его, раскомментируя строку.

...