From f97c847e29edd376a9698740475dd51fde6b108c Mon Sep 17 00:00:00 2001 From: skaparate Date: Thu, 3 Sep 2020 07:34:12 -0400 Subject: [PATCH] fix(learn): formatting bug preventing tests to pass (#39045) * implemented object validation * fix: formatting bug preventing tests to pass * implemented object validation * fix: formatting bug preventing tests to pass * integrated changes again * added suggested changes * fix: refine instructions * fix: revert some bad instructions and change album to albumTitle Co-authored-by: moT01 <20648924+moT01@users.noreply.github.com> --- .../record-collection.english.md | 158 ++++++++++-------- 1 file changed, 88 insertions(+), 70 deletions(-) diff --git a/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/record-collection.english.md b/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/record-collection.english.md index 68562809b1..d9d35a7e64 100644 --- a/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/record-collection.english.md +++ b/curriculum/challenges/english/02-javascript-algorithms-and-data-structures/basic-javascript/record-collection.english.md @@ -8,52 +8,54 @@ forumTopicId: 18261 --- ## Description +
-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. -The `push` array method will be helpful here. Check out our Manipulate Arrays With push() challenge to review how it works. -You may refer back to Manipulating Complex Objects Introducing JavaScript Object Notation (JSON) for a refresher. + +You are given a JSON object 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. + +You start with an `updateRecords` function that takes an object like `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. + +- Your function must always return the entire object. +- 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 `collection` object is used for the tests.
## Instructions +
## Tests +
```yml tests: - - text: You should not change the collection object's initialization - testString: 'assert(code.match(/var collection = {\s*2548: {\s*album: "Slippery When Wet",\s*artist: "Bon Jovi",\s*tracks: \[\s*"Let It Rock",\s*"You Give Love a Bad Name"\s*\]\s*},\s*2468: {\s*album: "1999",\s*artist: "Prince",\s*tracks: \[\s*"1999",\s*"Little Red Corvette"\s*\]\s*},\s*1245: {\s*artist: "Robert Palmer",\s*tracks: \[ \]\s*},\s*5439: {\s*album: "ABBA Gold"\s*}\s*};/g));' - - text: After updateRecords(5439, "artist", "ABBA"), artist should be "ABBA" - testString: assert(updateRecords(5439, "artist", "ABBA")[5439]["artist"] === "ABBA"); - - text: After updateRecords(5439, "tracks", "Take a Chance on Me"), tracks should have "Take a Chance on Me" as the last element. - testString: assert(updateRecords(5439, "tracks", "Take a Chance on Me")[5439]["tracks"].pop() === "Take a Chance on Me"); - - text: After updateRecords(2548, "artist", ""), artist should not be set - testString: updateRecords(2548, "artist", ""); assert(!collection[2548].hasOwnProperty("artist")); - - text: After updateRecords(1245, "tracks", "Addicted to Love"), tracks should have "Addicted to Love" as the last element. - testString: assert(updateRecords(1245, "tracks", "Addicted to Love")[1245]["tracks"].pop() === "Addicted to Love"); - - text: After updateRecords(2468, "tracks", "Free"), tracks should have "1999" as the first element. - testString: assert(updateRecords(2468, "tracks", "Free")[2468]["tracks"][0] === "1999"); - - text: After updateRecords(2548, "tracks", ""), tracks should not be set - testString: updateRecords(2548, "tracks", ""); assert(!collection[2548].hasOwnProperty("tracks")); - - text: After updateRecords(1245, "album", "Riptide"), album should be "Riptide" - testString: assert(updateRecords(1245, "album", "Riptide")[1245]["album"] === "Riptide"); - + - text: After updateRecords(collection, 5439, "artist", "ABBA"), artist should be ABBA + testString: assert(updateRecords(_recordCollection, 5439, "artist", "ABBA")[5439]["artist"] === "ABBA"); + - text: After updateRecords(collection, 5439, "tracks", "Take a Chance on Me"), tracks should have Take a Chance on Me as the last element. + testString: assert(updateRecords(_recordCollection, 5439, "tracks", "Take a Chance on Me")[5439]["tracks"].pop() === "Take a Chance on Me"); + - text: After updateRecords(collection, 2548, "artist", ""), artist should not be set + testString: updateRecords(_recordCollection, 2548, "artist", ""); assert(!_recordCollection[2548].hasOwnProperty("artist")); + - text: After updateRecords(collection, 1245, "tracks", "Addicted to Love"), tracks should have Addicted to Love as the last element. + testString: assert(updateRecords(_recordCollection, 1245, "tracks", "Addicted to Love")[1245]["tracks"].pop() === "Addicted to Love"); + - text: After updateRecords(collection, 2468, "tracks", "Free"), tracks should have 1999 as the first element. + testString: assert(updateRecords(_recordCollection, 2468, "tracks", "Free")[2468]["tracks"][0] === "1999"); + - text: After updateRecords(collection, 2548, "tracks", ""), tracks should not be set + testString: updateRecords(_recordCollection, 2548, "tracks", ""); assert(!_recordCollection[2548].hasOwnProperty("tracks")); + - text: After updateRecords(collection, 1245, "albumTitle", "Riptide"), albumTitle should be Riptide + testString: assert(updateRecords(_recordCollection, 1245, "albumTitle", "Riptide")[1245]["albumTitle"] === "Riptide"); ```
## Challenge Seed +
@@ -61,84 +63,100 @@ tests: // Setup var collection = { 2548: { - album: "Slippery When Wet", - artist: "Bon Jovi", - tracks: [ - "Let It Rock", - "You Give Love a Bad Name" - ] + albumTitle: '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" - ] + albumTitle: '1999', + artist: 'Prince', + tracks: ['1999', 'Little Red Corvette'] }, 1245: { - artist: "Robert Palmer", - tracks: [ ] + artist: 'Robert Palmer', + tracks: [] }, 5439: { - album: "ABBA Gold" + albumTitle: 'ABBA Gold' } }; // Only change code below this line -function updateRecords(id, prop, value) { - - - return collection; +function updateRecords(object, id, prop, value) { + return object; } -updateRecords(5439, "artist", "ABBA"); +updateRecords(collection, 5439, 'artist', 'ABBA'); ```
+ +## Before Test + +
+ +```js +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' + } +}; +``` + +
+
## Solution +
```js var collection = { 2548: { - album: "Slippery When Wet", - artist: "Bon Jovi", - tracks: [ - "Let It Rock", - "You Give Love a Bad Name" - ] + albumTitle: '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" - ] + albumTitle: '1999', + artist: 'Prince', + tracks: ['1999', 'Little Red Corvette'] }, 1245: { - artist: "Robert Palmer", - tracks: [ ] + artist: 'Robert Palmer', + tracks: [] }, 5439: { - album: "ABBA Gold" + albumTitle: 'ABBA Gold' } }; // Only change code below this line -function updateRecords(id, prop, value) { - if(value === "") delete collection[id][prop]; - else if(prop === "tracks") { - collection[id][prop] = collection[id][prop] || []; - collection[id][prop].push(value); +function updateRecords(object, id, prop, value) { + if (value === '') delete object[id][prop]; + else if (prop === 'tracks') { + object[id][prop] = object[id][prop] || []; + object[id][prop].push(value); } else { - collection[id][prop] = value; + object[id][prop] = value; } - return collection; + return object; } ```