Skip to content

Update Record Collection #11

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
155 changes: 60 additions & 95 deletions javascript/FreeCodeCamps/Basic JavaScript/Record Collection.md
Original file line number Diff line number Diff line change
@@ -1,26 +1,16 @@
# Record Collection

You are given a `JSON` object representing (a small part of) your record collection.
Each album is identified by a unique `id` number (`its key`) and has
several properties. Not all albums have complete information.

Write a function which takes an `id`, a property (prop), and a value.

For the given `id` in collection:

If prop does not contain the key `tracks`, then update or set
the value for that incomplete prop.

If prop does not contain the key `tracks` before you update
it, create an empty array before pushing a track to it.

If prop does contain the key `tracks` and its value is non-blank,
then push the value onto the end of its existing tracks array.

If value is blank, delete that prop.

Always return the entire collection object.

You are given an object literal representing a part of your musical album collection. Each album has a unique id number as its key and several other properties. Not all albums have complete information. <br>
<br>
You start with an `updateRecords` function that takes an object literal, `records`, containing the musical album collection, an `id`, a `prop` (like `artist` or `tracks`), and a `value`. Complete the function using the rules below to modify the object passed to the function.<br>
<br>
Your function must always return the entire record collection object.<br>
- If `prop` isn't `tracks` and value isn't an empty string, update or set that album's `prop` to `value`.
- If `prop` is` tracks` but the album doesn't have a `tracks` property, create an empty array and add `value` to it.
- If `prop` is `tracks` and `value` isn't an empty string, add `value` to the end of the album's existing `tracks` array.
- If `value` is an empty string, delete the given `prop` property from the album.
Note: A copy of the `recordCollection` object is used for the tests.<br>
<br>
## Hints
- Use `bracket notation` when accessing object properties with variables.

Expand All @@ -32,97 +22,72 @@ You may refer back to Manipulating Complex ObjectsIntroducing JavaScript Object

```javascript
// 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"
}
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'
}
};
// 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;
function updateRecords(records, id, prop, value) {
return records;
}

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

### Answers

```javascript
// 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"
}
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'
}
};
// 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) {
function updateRecords(records, id, prop, value) {

if (value === '') {
delete collection[id][prop]; // If the value is empty remove the prop
} else if (prop !== "tracks") {
collection[id][prop] = value;
if (value === '') {
delete records[id][prop];
} else if (prop === 'tracks') {
records[id][prop] = records[id][prop] || []; // this is called shortcircuit evaluation, see below for explanation
records[id][prop].push(value);
} else {
if (!collection[id].hasOwnProperty('tracks')) {
collection[id].tracks = [];
collection[id].tracks.push(value);
} else {
collection[id].tracks.push(value);
}
records[id][prop] = value;
}
return collection;
return records;
}

// Alter values below to test your code
updateRecords(2468, "tracks", "Free");
updateRecords(recordCollection, 5439, 'artist', 'ABBA');
```

### Thinking
Expand All @@ -131,4 +96,4 @@ updateRecords(2468, "tracks", "Free");
2. If the prop is not tracks it's easy to add the value to this prop
3. Here we need to find if the object have a property tracks if not we create
this prop with a empty array and we push it the value. I use `.hasOwnProperty` for
doing this.
doing this.