0

Object property value differentiates from the value I'm assigning to it,even though none other changes are made to the property which I checked with implementation of Object. watch I found at this link Watch for object properties changes in JavaScript. From sofascore I'm getting an array with weeks (objects with start and end time) and I want to add home and away standings to each week as they were at the end of that week.I'm getting matches and their start time and result also from sofascore. My sorting algorithm which sorts the table and pushes teams to their index in standings.home or standings.away array is working as expected.

I've worked on this for a couple hours now and a couple of hours last night and I think that I've already tried every possible solution that I can think of.

const https = require('https');
function get(url) {
  return new Promise( resolve => {
https.get(url , res => {
  res.setEncoding("utf8");
  let body = "";
  res.on("data", data => {body += data;});
  res.on("end", () => {resolve(body)});
  });
});
}
function standingsByWeek(tournamentID,seasonID)  {


 const baseURL = 'https://www.sofascore.com/';
 var league,weeks,matches,teams,teamsIDs,standings,currentWeekIndex = 0,table = {},possiblePoints = [3,1,0];
  get( baseURL + 'u-tournament/' + tournamentID + '/season/' + seasonID + '/json').then(function(league) { //get data for league
    league = JSON.parse(league);
    weeks = league.events.weeks;
    teams = league.teams;

for (let i = 0; i < teams.length; i++) {   //fill up table with teams
  table[teams[i].id] = { id : teams[i].id, home : [0,0,0,0,0,0,teams[i].id], away : [0,0,0,0,0,0,teams[i].id]} ; // wins,draws,losses,score,conceded,points
}; 
teamsIDs = Object.keys(table); //extract keys (teamsIDs) from table
return get( baseURL + 'u-tournament/'+tournamentID+'/season/'+seasonID+'/matches/week/'+weeks[0].weekStartDate+'/'+weeks[weeks.length-1].weekEndDate)// get data for matches 
}).then(function(matches) { 
  matches = JSON.parse(matches).weekMatches.tournaments[0].events; // assign matches to matches


    for (let i = 0; i < matches.length; i++) { //update the table for every finished match
      with (matches[i]){  

        if(status.code != 100){continue} // continue if match not finished

      var outcome = Math.sign(homeScore.normaltime - awayScore.normaltime); // get outcome 1 = win , 0 = draw , -1 lose (for home team)
            table[homeTeam.id].home[Math.abs(outcome - 1)] ++; //  incrementing number at index for outcome 
            table[awayTeam.id].away[outcome + 1] ++;           //                -||-

            table[homeTeam.id].home[3] += homeScore.normaltime; // adding scored goals in home team's home table
            table[homeTeam.id].home[4] += awayScore.normaltime; // adding conceded goals in home team's home table
            table[awayTeam.id].away[3] += awayScore.normaltime; // adding scored goals in away team's away table
            table[awayTeam.id].away[4] += homeScore.normaltime; // adding conceded goals in away team's away table

            table[homeTeam.id].home[5] += possiblePoints[Math.abs(outcome - 1)]; // adding earned points to home team's home table
            table[awayTeam.id].away[5] += possiblePoints[Math.abs(outcome + 1)]; // adding earned points to away team's away table

        }
               // if this is the last match of the season or current week ended ,sort the table and push standings to that week and increase current week index
      if ( (i + 1) == matches.length || weeks[currentWeekIndex].weekEndDate < matches[i + 1].startTimestamp ) { 


         standings = {home : [], away:[] };

        for (let j = 0; j < 2; j++) { // loop through both keys in standings
          var HoA = Object.keys(standings)[j]; //home or away 
      k : for (let k = 0; k < teamsIDs.length; k++) { // loop through all teams in the table
            for (let l = 0; l <= standings[HoA].length; l++) { // loop through all teams added to standings
                    var EoL =  Boolean(l == standings[HoA].length) // empty or last
                    var tableTeam = table[teamsIDs[k]][HoA] ; 
                    var standingsTeam = EoL ? null : standings[HoA][l]; //standings team or null if standings is empty
                    var pointDiff = l == standings[HoA].length ?  null : Math.sign(tableTeam[5] - standingsTeam[5])  ; // point difference 1 = table team has more, 0 = equal # of points, -1= standings team has more points

                    // standings empty(or last) or more points or equal points and better goal difference
                    if ( EoL ||  (pointDiff == 1) || !pointDiff && (tableTeam[3] - tableTeam[4]) > (standingsTeam[3] - standingsTeam[4] ) ) {      
                      standings[HoA].splice(l,0,table[teamsIDs[k]][HoA]); // put team from table to index at which team which it was compared to was
                      continue k // go to another team
                    }

                  }         
          }
    } 

         //  USING THIS INSTEAD OF LINE BELOW IT YOU CAN SEE WHAT VALUE IS BEING ASSIGNED TO STANDINGS PROPERTY OF WEEK OBJECT
         //Object.defineProperty(weeks[currentWeekIndex],'setter',{set: function (value) {this.standings = value;console.log(currentWeekIndex,value);}})
         // weeks[currentWeekIndex].setter = Object.assing({},standings);
        weeks[currentWeekIndex].standings = Object.assign({},standings);// assigning standings clone to standing property of current week 

        currentWeekIndex++;// increase week index 
    }
      }     
      console.log(weeks[0].standings);

  }
)


 }
standingsByWeek(17,13380); // premier league  , season 17/18 

I expect object property to have the same value as the assigned value if none other changes to property are made.

EDIT link to tidied and runnable version of the code https://repl.it/@mwittig/objectPropertiesChange (thanks to Marcus)

Matija
  • 493
  • 4
  • 9
  • 21
  • 1
    Please provide a complete and tidied source code snippet. Your code is not runnable as it is some package required. – Marcus Mar 30 '19 at 20:24
  • how can I do that? – Matija Mar 30 '19 at 20:31
  • You want to cleanup your code and make it so we can easily run it without needing to edit the code first. – PLASMA chicken Mar 30 '19 at 20:35
  • Sorry, actually I found your code is complete. Seems like I didn't catch the whole snippet when I copied it to reply. Here is a tidied and runnable version of your code - https://repl.it/@mwittig/objectPropertiesChange – Marcus Mar 30 '19 at 20:36
  • +PASMA chicken this is as clean as it gets if you want to reproduce the problem,please help,I'm desparate – Matija Mar 30 '19 at 20:39
  • 2
    This is not a minimal example of your problem, there are dozens of unrelated things going on. Reduce your code until you find the source of your problem, then ask about that. – Etheryte Mar 30 '19 at 20:48
  • +Nit so I simplified it to only push overall standings and to sort standings only by points (no goal difference) and now it works,I will built it up from here step by step and hopefully find exactly what was the problem – Matija Mar 30 '19 at 21:57

0 Answers0