0

I have an empty Array

var kpi_arr = [];

I push in an Object

{
   kpi_id: "18",
   kpi_name: "CSAT",
   kpi_target: "7",
   kpi_months: [
      {
         monthname: "Aug 2017",
         month_value: "",
         month_id: "201",
         month_kpi: "18"
      },
      {
         monthname: "Sep 2017",
         month_value: "",
         month_id: "301",
         month_kpi: "18"
      }
   ]
}

The Array now has one object with the correct values. However when i push in a second object

{
   kpi_id: "16",
   kpi_name: "Updated handbooks",
   kpi_target: " 100%",
   kpi_months: [
      {
         monthname: "Aug 2017",
         month_value: "",
         month_id: "201",
         month_kpi: "16"
      },
      {
         monthname: "Sep 2017",
         month_value: "",
         month_id: "301",
         month_kpi: "16"
      }
   ]
}

the array content appears as below

[
{
   kpi_id: "18",
   kpi_name: "CSAT",
   kpi_target: "7",
   kpi_months: [
      {
         monthname: "Aug 2017",
         month_value: "",
         month_id: "201",
         month_kpi: "16"
      },
      {
         monthname: "Sep 2017",
         month_value: "",
         month_id: "301",
         month_kpi: "16"
      }
   ]
},
{
   kpi_id: "16",
   kpi_name: "Updated handbooks",
   kpi_target: " 100%",
   kpi_months: [
      {
         monthname: "Aug 2017",
         month_value: "",
         month_id: "201",
         month_kpi: "16"
      },
      {
         monthname: "Sep 2017",
         month_value: "",
         month_id: "301",
         month_kpi: "16"
      }
   ]
}
]

Note that all month_kpi property values change to 16. What could be the reason for this? I'm pushing these objects into the array via a for-loop in the format below.

var rolling_months_arr = get_rolling_13month_period();
var kpi_arr = [];

for(){
 var month_kpi = getValueFromWherever();
 var myobject = getObject(rolling_months_arr, month_kpi)
 kpi_arr.push(myobject )
}


//------------------------------------------
function getObject(rolling_months_arr, month_kpi)
{       
    for ( var i = 0; i < rolling_months_arr.length; i++)
    {
        rolling_months_arr[i].month_kpi = month_kpi;
    }

    return rolling_months_arr;
}

function get_rolling_13month_period()
{       
    var month_arr = [];             
    for(){
      month_arr.push({ "monthname": rolling_month,  "month_id": month_id });
      }
    return month_arr;
}
Mike Badazz
  • 55
  • 1
  • 1
  • 7

1 Answers1

1

rolling_months_arr is being reused, you need to create a new one inside the for()

you are using the same rolling_months_arr each time you add to the array.push, so the values are changed in all instances

put var rolling_months_arr = get_rolling_13month_period(); inside the for()

or clone that var: for(){ var month_kpi = getValueFromWherever(); rolling_months_arr = _.cloneDeep(rolling_months_arr); //<= cloneDeep var myobject = getObject(rolling_months_arr, month_kpi) kpi_arr.push(myobject ) }

UXDart
  • 2,500
  • 14
  • 12
  • Is there any other way apart from that? The reason am not doing that is because running the **get_rolling_13month_period()** multiple times via the For-Loop is kinda "expensive" for me since its getting the data from another system and the for loop runs about 46 times. This will mean i get the data 46 times and of which the 1st time is already fairly slow. – Mike Badazz Aug 23 '18 at 07:26