-
-
Notifications
You must be signed in to change notification settings - Fork 224
London | 26-ITP-Jan | Mohsen Zamani | sprint 2 | coursework #953
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
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,3 +1,10 @@ | ||
| function contains() {} | ||
| function contains(obj, property) { | ||
| try { | ||
| const keys = Object.keys(obj); | ||
| return keys.includes(property); | ||
|
Comment on lines
+3
to
+4
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This work. Suggestion: Look up these two alternatives and find out their differences |
||
| } catch (error) { | ||
| throw new Error("The parameter given is not a plain JS object."); | ||
| } | ||
| } | ||
|
|
||
| module.exports = contains; | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -20,16 +20,32 @@ as the object doesn't contains a key of 'c' | |
| // Given an empty object | ||
| // When passed to contains | ||
| // Then it should return false | ||
| test.todo("contains on empty object returns false"); | ||
| test("contains on empty object returns false", () => | ||
| expect(contains({}, "key1")).toEqual(false)); | ||
|
|
||
| // Given an object with properties | ||
| // When passed to contains with an existing property name | ||
| // Then it should return true | ||
| test("contains returns true when object contains the given property", () => | ||
| expect(contains({ key1: "value1", key2: "value2" }, "key1")).toEqual(true)); | ||
|
|
||
| // Given an object with properties | ||
| // When passed to contains with a non-existent property name | ||
| // Then it should return false | ||
| test("contains returns false when object does not contain the given property", () => | ||
| expect(contains({ key1: "value1", key2: "value2" }, "key4")).toEqual(false)); | ||
|
|
||
| // Given invalid parameters like an array | ||
| // When passed to contains | ||
| // Then it should return false or throw an error | ||
| it("contains returns false or throws an error if given parameter is not a valid object", () => { | ||
| expect(contains([], "key1")).toEqual(false); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Array is a kind of object where indexes serve as its keys. With your current implementation, |
||
| expect(contains("key1:value1", "key1")).toEqual(false); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. With your current implementation, this test (with the 2nd argument changed to |
||
| expect(contains(5235, "key1")).toEqual(false); | ||
| expect(() => contains(undefined, "key1")).toThrow( | ||
| "The parameter given is not a plain JS object." | ||
| ); | ||
| expect(() => contains(null, "key1")).toThrow( | ||
| "The parameter given is not a plain JS object." | ||
| ); | ||
|
Comment on lines
+45
to
+50
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Number is not a plain JS object but it is given a different treatment. Wouldn't it be "friendlier to the caller" if the function can be designed to behave consistently for any value that is not an object or is an array? |
||
| }); | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,9 @@ | ||
| function createLookup() { | ||
| // implementation here | ||
| function createLookup(countryCurrencyPairs) { | ||
| if (!Array.isArray(countryCurrencyPairs)) return {}; | ||
| return countryCurrencyPairs.reduce((acc, curr) => { | ||
| acc[curr[0]] = curr[1]; | ||
| return acc; | ||
| }, {}); | ||
| } | ||
|
|
||
| module.exports = createLookup; |
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please note that in real querystring, both |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -6,8 +6,29 @@ function parseQueryString(queryString) { | |
| const keyValuePairs = queryString.split("&"); | ||
|
|
||
| for (const pair of keyValuePairs) { | ||
| const [key, value] = pair.split("="); | ||
| queryParams[key] = value; | ||
| let key = "", | ||
| value = ""; | ||
| let equalSignIndex = pair.indexOf("="); | ||
|
|
||
| if (equalSignIndex === -1) { | ||
| key = pair; | ||
| value = ""; | ||
| } else { | ||
| key = pair.slice(0, equalSignIndex); | ||
| value = pair.slice(equalSignIndex + 1); | ||
| } | ||
|
|
||
| const existingKeys = Object.keys(queryParams); | ||
| if (key === "" && value === "") continue; | ||
| if (existingKeys.includes(key)) { | ||
|
Comment on lines
+21
to
+23
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We could just check |
||
| if (queryParams[key] === value) continue; | ||
| if (Array.isArray(queryParams[key])) { | ||
| queryParams[key].push(value); | ||
| } else { | ||
| const temp = queryParams[key]; | ||
| queryParams[key] = [temp, value]; | ||
| } | ||
| } else queryParams[key] = value; | ||
| } | ||
|
|
||
| return queryParams; | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,3 +1,9 @@ | ||
| function tally() {} | ||
| function tally(list) { | ||
| if (!Array.isArray(list)) throw new Error("Not an array."); | ||
| return list.reduce((acc, curr) => { | ||
| acc[curr] = (acc[curr] || 0) + 1; | ||
| return acc; | ||
| }, {}); | ||
| } | ||
|
Comment on lines
+1
to
+7
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does the following function call returns the value you expect? Suggestion: Look up an approach to create an empty object with no inherited properties. |
||
|
|
||
| module.exports = tally; | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -10,20 +10,28 @@ function invert(obj) { | |
| const invertedObj = {}; | ||
|
|
||
| for (const [key, value] of Object.entries(obj)) { | ||
| invertedObj.key = value; | ||
| invertedObj[value] = key; | ||
| } | ||
|
|
||
| return invertedObj; | ||
| } | ||
|
|
||
| module.exports = invert; | ||
|
|
||
| // a) What is the current return value when invert is called with { a : 1 } | ||
| // { key: 1 } | ||
|
|
||
| // b) What is the current return value when invert is called with { a: 1, b: 2 } | ||
| // { key: 2 } | ||
|
|
||
| // c) What is the target return value when invert is called with {a : 1, b: 2} | ||
| // { key: 2 } | ||
|
Comment on lines
27
to
+28
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. "Target return value" refers to the expected return value (when the function is correctly implemented). |
||
|
|
||
| // c) What does Object.entries return? Why is it needed in this program? | ||
| // it returns each pair of key and value as array. | ||
| // it is needed for iteration through an object | ||
|
|
||
| // d) Explain why the current return value is different from the target output | ||
| // because the place of key and value are not swapped | ||
|
|
||
| // e) Fix the implementation of invert (and write tests to prove it's fixed!) | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| const invert = require("./invert.js"); | ||
|
|
||
| describe("invert", () => { | ||
| it("returns empty object if passed empty object", () => | ||
| expect(invert({})).toEqual({})); | ||
|
|
||
| it("returns inverted object of the passed object", () => { | ||
| expect(invert({ a: 1, b: 2 })).toEqual({ 1: "a", 2: "b" }); | ||
| expect(invert({ a: 1, b: 2, c: 3, d: 4, e: 5 })).toEqual({ | ||
| 1: "a", | ||
| 2: "b", | ||
| 3: "c", | ||
| 4: "d", | ||
| 5: "e", | ||
| }); | ||
| }); | ||
| }); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -26,3 +26,14 @@ | |
| 3. Order the results to find out which word is the most common in the input | ||
| */ | ||
|
|
||
| function countWords(string) { | ||
| const noPunctuationStr = string.replace(/[.,!?]/g, ""); | ||
| const wordArray = noPunctuationStr.split(" "); | ||
| let wordCount = new Map(); | ||
| for (let word of wordArray) { | ||
| wordCount.set(word, (wordCount.get(word) || 0) + 1); | ||
| } | ||
| const sortedWordCount = [...wordCount.entries()].sort((a, b) => b[1] - a[1]); | ||
| return sortedWordCount; | ||
|
Comment on lines
+30
to
+38
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can you check if your function returns what you expect in the following function calls? |
||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could also explore using
Array.prototype.join()to produce the desired string .