0

I am trying to figure out how to append a new value to the same property of an object. I have this code below:

let xp_logs = {};
for (let i = 0; i <= rows.length; i++) {
    if (rows[i]) {
        if(member.roles.cache.find(r => r.id == roles.admin)) {
            xp_logs[todaysDate] = {}
            xp_logs[todaysDate][member[i].displayName] = {id: member[i].user.id, xp: rows[i].xp}
            console.log(member.displayName) // returns multiple names, last name is Henry (from rows)
        }
    }
}
fs.writeFileSync("./xp_logs.json", "\n" + JSON.stringify(xp_logs, null, 2));

The value [member.displayName] changes every for loop, and I want every loop to create a new value within [todaysDate] with [member.displayName] property name.

It currently replaces property names with the next name from the row, instead of adding a new property, and at the end of the for loop, it only saves the last name from the row.

{
  "7/21/2022": {
    "Henry": {
      "id": "331231456712356126",
      "xp": 280
    }
  }
}

However, I want to make it look like this:

{
  "7/21/2022": {
    "Sierra": {
      "id": "123561241241241244",
      "xp": 190
    },
    "Cammy": {
      "id": "556574574574234234",
      "xp": 600
    },
    "Henry": {
      "id": "331231456712356126",
      "xp": 280
    }
  }
}

1 Answer 1

1

You're resetting xp_logs[todaysDate] to an empty object each time through the loop. You should only do that if the property doesn't already exist.

Also, for loops should use the condition i < rows.length;, not i <= rows.length;. Array indexes go from 0 to length-1. With this fix you don't need the extra check if (rows[i]), which was only needed to skip the iteration after the end of the array.

let xp_logs = {};
for (let i = 0; i < rows.length; i++) {
  if (member.roles.cache.find(r => r.id == roles.admin)) {
    if (!xp_logs[todaysDate]) {
      xp_logs[todaysDate] = {};
    }
    xp_logs[todaysDate][member.displayName[i]] = {
      id: member.user.id,
      xp: rows[i].xp
    }
    console.log(member.displayName) // returns multiple names, last name is Henry (from rows)
  }
}

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you! I have no idea how I've missed that. Probably sleep depravation. It now works correctly.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.