Blog on learning

Record Collection

|

The problem lies below:


// 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) {


  return collection;
}

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

and the challenge is:

  • 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.

- 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.

The obstacle:

The two bold challenges above are what the most people including me failed to comply. Seems like we could success to perform either one, or another. Just not both at the same time, so if there are third or different solution that succeed please do share. Here are two different solutions below that I have found to this problem.

Two solutions so far:

FCC Solution which can be explained further on freecodecamp-github:

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;
}


Another solution could be found in briennakh-github:

function updateRecords(id, prop, value) {
  // Add property if it doesn't exist
  if (!collection[id][prop]) {
    if (prop == "tracks") {
      collection[id][prop] = [];
    } else {
      collection[id][prop] = "";
    }
  }

  // Add value to property
  if (value) {
      if (collection[id][prop].constructor == Array) {
        collection[id][prop].push(value);
      } else {
        collection[id][prop] = value;
      }
    // Delete given prop if value is empty
    } else {
      delete collection[id][prop];
    }

  return collection;
}


[Update] A third solution found on revisualize-github:

function updateRecords(id, prop, value) {
  if (value !== '') {
      if (prop === 'tracks') {
          if (!collection[id].hasOwnProperty(prop)) {
            collection[id][prop] = [];
          }
          collection[id][prop].push(value);
      } else {
          collection[id][prop] = value;
      }
  } else {
    delete collection[id][prop];
  }
  return collection;
}

Comments