Record Collection (Challenge)

Tell us what’s happening:
Why isn’t my code working? it should be working!

You are given a JSON object representing a part of your musical album collection. Each album has several properties and a unique id number as its key. Not all albums have complete information.

Write a function which takes an album’s id (like 2548 ), a property prop (like "artist" or "tracks" ), and a value (like "Addicted to Love" ) to modify the data in this collection.

If prop isn’t "tracks" and value isn’t empty ( "" ), update or set the value for that record album’s property.

Your function must always return the entire collection object.

There are several rules for handling incomplete data:

If prop is "tracks" but the album doesn’t have a "tracks" property, create an empty array before adding the new value to the album’s corresponding property.

If prop is "tracks" and value isn’t empty ( "" ), push the value onto the end of the album’s existing tracks array.

If value is empty ( "" ), delete the given prop property from the album.

Your code so far


// Setup
var collection = {
    "2548": {
      "album": "Slippery When Wet",
      "artist": "Bon Jovi",
      "tracks": [ 
        "Let It Rock", 
        "You Give Love a Bad Name" 
      ]
    },
    "2468": {
      "album": "1999",
      "artist": "Prince",
      "tracks": [ 
        "1999", 
        "Little Red Corvette" 
      ]
    },
    "1245": {
      "artist": "Robert Palmer",
      "tracks": [ ]
    },
    "5439": {
      "album": "ABBA Gold"
    }
};
// Keep a copy of the collection for tests
var collectionCopy = JSON.parse(JSON.stringify(collection));

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

  if(prop === "tracks") {
    if(value !== "") {
      collection[id][prop].push(value) ;
    } 
  }

  
  return collection;
}

// Alter values below to test your code
updateRecords(2468, "tracks", "Free");

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36.

Hello Per, check this part of your code:

  if(prop === "tracks") {
    if(!collection.hasOwnProperty(prop)) {
      collection[id][prop] = [] ;
      collection[id][prop].push(value) ;
    }
  }

  if(prop === "tracks") {
    if(value !== "") {
      collection[id][prop].push(value) ;
    } 
  }

These are the ones that are not correct:

  • After updateRecords(2468, "tracks", "Free") , tracks should have "1999" as the first element.

  • After updateRecords(2548, "tracks", "") , tracks should not be set

Let’s see what is wrong.

  • if you do: updateRecords(2468, "tracks", "Free") two if statements will be executed (your forgot something in collection.hasOwnProperty), the first one, that is “creating” the prop, but if you notice, 2468 has more tracks. The code is assinging an empty array, then pushing the value. (You can always use console.log to debug)

  • if you do: updateRecords(2548, "tracks", "") you can notice in your code one of your if is being executed, it checks that “tracks” is not a property, but it is not checking that the value is empty. It is supposed to be deleted.

1 Like

Hi Kurtony, thank you for telling me what is wrong with the code. I will fix it as soon as possible.

Thank you Randell I will fix my code soon.