Basic JavaScript - Record Collection

Tell us what’s happening:

I have multiple questions regarding this challenge. It took me a while to figure out prop is actually albumTitle, artist, tracks, but I can’t see any code that has assigned these values to prop. Am I missing something? Please do let me know.
Also, at first, I wrote everything in dot notation but it didn’t compile. But when I used bracket notations, it worked just fine. Why can’t I use dot notations?
And for my last question,

After updateRecords(recordCollection, 5439, "tracks", "Take a Chance on Me"), tracks should have the string Take a Chance on Me as the last and only element.

This is the only error I’m getting. Where am I going wrong?

Your code so far

// Setup
const recordCollection = {
  2548: {
    albumTitle: 'Slippery When Wet',
    artist: 'Bon Jovi',
    tracks: ['Let It Rock', 'You Give Love a Bad Name']
  },
  2468: {
    albumTitle: '1999',
    artist: 'Prince',
    tracks: ['1999', 'Little Red Corvette']
  },
  1245: {
    artist: 'Robert Palmer',
    tracks: []
  },
  5439: {
    albumTitle: 'ABBA Gold'
  }
};

// Only change code below this line
function updateRecords(records, id, prop, value) {
  if (prop!='tracks' && value!==""){
    records[id][prop] = value;
  } else if (prop=='tracks' && records[id].tracks.hasOwnProperty===false){
    records[id][tracks]=[value];
  } else if (prop =='tracks' && value!==""){
    records[id][prop].push(value);
  } else if (value==""){
    delete records[id][prop];
  }
  return records;
}

updateRecords(recordCollection, 5439, 'artist', 'ABBA');

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0

Challenge: Basic JavaScript - Record Collection

Link to the challenge:

You don’t see the error in the console?

TypeError: Cannot read properties of undefined (reading ‘hasOwnProperty’)

That looks like this line:

} else if (prop=='tracks' && records[id].tracks.hasOwnProperty===false){

If I put this at the top of the function:

console.log(records[id].tracks)

I see the issue. Remember that in JS (and most languages) it is a big no-no to try to access a property or method on ‘null’ or ‘undefined’.

Also, this:

records[id].tracks.hasOwnProperty===false

… I don’t think that means what you think it means.

Hello.
No, I did not get any error in the console.

I changed the line that was causing the error to

else if (prop=='tracks' && records[id].hasOwnProperty("tracks")===false)

and I also changed this line, I put tracks in double quotations

records[id]["tracks"]=[value];

Now the code seems to work. Thank you for your reply.

It’s weird, I’m not getting it now.

When you call a function with arguments you are sending it to the parameters of that function.

function definition(parameter) {
    return parameter === 'hold on to this for me parameter'
}

definition('hold on to this for me parameter')//true

So at the bottom of your code where you see updateRecords(recordCollection, 5439, 'artist', 'ABBA');, that is where these values are being assigned to the parameters. The function is also being called in the background with the other test cases with other values.

Dot notation only works with the literal property names. But with this function the property names are stored in variables, and only bracket notation works with variables. So you cant do records.id.prop because records (recordsCollection) does not have a property named id or prop in them. But records[id][prop] will use the values passed to them from the function call.

1 Like