Record Collection please help me

Tell us what’s happening:
Hello everyone,
So far I tried for a couple of hours this exercise but I didn’t understand it, neither the exercise nor the solution given in the “get a hint” page then I’m a bit frustrated.

the exercise says:

Blockquote

Basic JavaScript: Record Collection

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.

Hints
Use bracket notation when accessing object properties with variables.

Push is an array method you can read about on Mozilla Developer Network.

You may refer back to Manipulating Complex Objects Introducing JavaScript Object Notation (JSON) for a refresher.
Blockquote

My questions are:

  1. Why is used directly prop === “tracks” in the first if?.. I though since “tracks” is part of the array then the code should specify where “tracks” is … I don’t know , something like collection[id][tracks] or something.

  2. Why in the else if the value is not in ? I though the idea was to get the array of value.

The code is bellow the questions.

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" && value!==""){
      if (collection[id][prop]){
          collection[id][prop].push(value);
      } else 
      {
        collection[id][prop] = [value]; 
      }
 } 
  else if (value !== "") {
        collection[id][prop] = value;
  } 
  else {
     delete collection[id][prop];
  }

  return collection;
}

// Alter values below to test your code
updateRecords(5439, "artist", "ABBA");

Your browser information:

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

Link to the challenge:

The first two rules of the challenge start with

If prop is ‘“track”` […]

prop is one of the arguments of the function, so that statement is checking if it is "tracks" being passed in

For example the call in the code you posted is

updateRecords(5439, "artist", "ABBA");

And in this case prop is "artist" so that statement would be false

tracks is a special case in this object – it is the only one that is an array. Thus, it makes sense to remove that option from the mess right off, then handle the more “generic” case of any other property. So here’s the logic:

if the property we're working with is '`tracks`', and we have a `value`:
  if the collection member **has** a tracks property:
    Do something to that tracks property
  else /* This would mean that it DOESN'T have a tracks */
    Create the tracks property and do something with it.
else
if we have a `value`:
  assign the property on this member to that value
else
  delete the property /* this works for any property, whether it's an array or not */

So, to answer your second question, the only property that expects an array is tracks. Thus in every other case, we simply assign value rather than [value].

1 Like