fix(guide): restructure curriculum guide articles (#36501)
* fix: restructure certifications guide articles * fix: added 3 dashes line before prob expl * fix: added 3 dashes line before hints * fix: added 3 dashes line before solutions
This commit is contained in:
@@ -1,9 +1,11 @@
|
||||
---
|
||||
title: Inventory Update
|
||||
---
|
||||
 Remember to use <a>**`Read-Search-Ask`**</a> if you get stuck. Try to pair program  and write your own code 
|
||||
|
||||
###  Problem Explanation:
|
||||
# Inventory Update
|
||||
|
||||
---
|
||||
## Problem Explanation
|
||||
|
||||
In this problem, you've to compare and update the inventory stored in a 2D array against a second 2D array of a fresh delivery. Update the current existing inventory item quantities (in `arr1`). If an item cannot be found, add the new item and quantity into the inventory array. The returned inventory array should be in alphabetical order by item.
|
||||
|
||||
@@ -13,100 +15,92 @@ The current as well as new inventory will be in this format: `[[2, "item-0"], [3
|
||||
|
||||
* <a href='https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array' target='_blank' rel='nofollow'>JS Array</a>
|
||||
|
||||
##  Hint: 1
|
||||
|
||||
---
|
||||
## Hints
|
||||
|
||||
### Hint 1
|
||||
|
||||
You need to work through each item of the new inventory to see if it exists in the current inventory or not. Remember that the product name is stored as the second element of each sub-array: `array[0][1] = "item-name"`.
|
||||
|
||||
> _try to solve the problem now_
|
||||
|
||||
##  Hint: 2
|
||||
### Hint 2
|
||||
|
||||
If the item exists, you need to add the quantity from the new inventory. If the item doesn't exist, you need to add the entire item.
|
||||
|
||||
> _try to solve the problem now_
|
||||
|
||||
##  Hint: 3
|
||||
### Hint 3
|
||||
|
||||
Return the completed inventory in alphabetical order.
|
||||
|
||||
> _try to solve the problem now_
|
||||
|
||||
## Spoiler Alert!
|
||||
|
||||

|
||||
|
||||
**Solution ahead!**
|
||||
|
||||
##  Basic Code Solution:
|
||||
<details><summary>Solution 1 (Click to Show/Hide)</summary>
|
||||
|
||||
```javascript
|
||||
function updateInventory(arr1, arr2) {
|
||||
function updateInventory(arr1, arr2) {
|
||||
// Variable for location of product
|
||||
var index;
|
||||
|
||||
// Variable for location of product
|
||||
var index;
|
||||
|
||||
// A helper method to return the index of a specified product (undefined if not found)
|
||||
var getProductIndex = function (name) {
|
||||
for (var i = 0; i < this.length; i++) {
|
||||
if (this[i][1] === name) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
// For each item of the new Inventory
|
||||
for (var i = 0; i < arr2.length; i++) {
|
||||
|
||||
// Invoke our helper function using arr1 as this
|
||||
index = getProductIndex.call(arr1, arr2[i][1]);
|
||||
|
||||
// If the item doesn't exist
|
||||
if (index === undefined) {
|
||||
// Push the entire item
|
||||
arr1.push(arr2[i]);
|
||||
} else {
|
||||
// Add the new quantity of the current item
|
||||
arr1[index][0] += arr2[i][0];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Sort alphabetically, by the product name of each item
|
||||
arr1.sort(function (a, b) {
|
||||
if (a[1] > b[1]) {
|
||||
return 1;
|
||||
}
|
||||
if (a[1] < b[1]) {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
|
||||
return arr1;
|
||||
// A helper method to return the index of a specified product (undefined if not found)
|
||||
var getProductIndex = function(name) {
|
||||
for (var i = 0; i < this.length; i++) {
|
||||
if (this[i][1] === name) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
|
||||
// test here
|
||||
// Example inventory lists
|
||||
var curInv = [
|
||||
[21, "Bowling Ball"],
|
||||
[2, "Dirty Sock"],
|
||||
[1, "Hair Pin"],
|
||||
[5, "Microphone"]
|
||||
];
|
||||
// For each item of the new Inventory
|
||||
for (var i = 0; i < arr2.length; i++) {
|
||||
// Invoke our helper function using arr1 as this
|
||||
index = getProductIndex.call(arr1, arr2[i][1]);
|
||||
|
||||
var newInv = [
|
||||
[2, "Hair Pin"],
|
||||
[3, "Half-Eaten Apple"],
|
||||
[67, "Bowling Ball"],
|
||||
[7, "Toothpaste"]
|
||||
];
|
||||
// If the item doesn't exist
|
||||
if (index === undefined) {
|
||||
// Push the entire item
|
||||
arr1.push(arr2[i]);
|
||||
} else {
|
||||
// Add the new quantity of the current item
|
||||
arr1[index][0] += arr2[i][0];
|
||||
}
|
||||
}
|
||||
|
||||
updateInventory(curInv, newInv);
|
||||
// Sort alphabetically, by the product name of each item
|
||||
arr1.sort(function(a, b) {
|
||||
if (a[1] > b[1]) {
|
||||
return 1;
|
||||
}
|
||||
if (a[1] < b[1]) {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
|
||||
return arr1;
|
||||
}
|
||||
|
||||
// test here
|
||||
// Example inventory lists
|
||||
var curInv = [
|
||||
[21, "Bowling Ball"],
|
||||
[2, "Dirty Sock"],
|
||||
[1, "Hair Pin"],
|
||||
[5, "Microphone"]
|
||||
];
|
||||
|
||||
var newInv = [
|
||||
[2, "Hair Pin"],
|
||||
[3, "Half-Eaten Apple"],
|
||||
[67, "Bowling Ball"],
|
||||
[7, "Toothpaste"]
|
||||
];
|
||||
|
||||
updateInventory(curInv, newInv);
|
||||
```
|
||||
|
||||
|
||||
### Code Explanation:
|
||||
#### Code Explanation
|
||||
|
||||
* The variable **index** stores the location (index) of a product.
|
||||
* The helper function `getProductIndex()` returns the index of a specified product. It iterates through each element of the array that it is called on until it can find the name parameter. If the product is not found in the inventory, `undefined` is returned.
|
||||
@@ -124,74 +118,75 @@ Return the completed inventory in alphabetical order.
|
||||
* <a href='http://forum.freecodecamp.com/t/javascript-array-prototype-push/14298' target='_blank' rel='nofollow'>JS Array.prototype.push()</a>
|
||||
* <a href='http://forum.freecodecamp.com/t/javascript-array-prototype-sort/14306' target='_blank' rel='nofollow'>JS Array.prototype.sort()</a>
|
||||
|
||||
##  Intermediate Code Solution:
|
||||
</details>
|
||||
<details><summary>Solution 2 (Click to Show/Hide)</summary>
|
||||
|
||||
|
||||
```javascript
|
||||
function updateInventory(arr1, arr2) {
|
||||
// All inventory must be accounted for or you're fired!
|
||||
function updateInventory(arr1, arr2) {
|
||||
// All inventory must be accounted for or you're fired!
|
||||
|
||||
var index;
|
||||
var arrCurInvName = []; // Names of arr1's items
|
||||
var arrNeInvName = []; // Names of arr2's items
|
||||
var index;
|
||||
var arrCurInvName = []; // Names of arr1's items
|
||||
var arrNeInvName = []; // Names of arr2's items
|
||||
|
||||
// Same as using two for loops, this takes care of increasing the number of stock quantity.
|
||||
arr1.map(function(item1) {
|
||||
return arr2.map(function(item2) {
|
||||
if (item1[1] === item2[1]) {
|
||||
item1[0] = item1[0] + item2[0]; //Increase number of stock
|
||||
}
|
||||
});
|
||||
});
|
||||
// Same as using two for loops, this takes care of increasing the number of stock quantity.
|
||||
arr1.map(function(item1) {
|
||||
return arr2.map(function(item2) {
|
||||
if (item1[1] === item2[1]) {
|
||||
item1[0] = item1[0] + item2[0]; //Increase number of stock
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Get item's name for new Inventory
|
||||
arr2.map(function(item) {
|
||||
arrNeInvName.push(item[1]);
|
||||
});
|
||||
// Get item's name for new Inventory
|
||||
arr2.map(function(item) {
|
||||
arrNeInvName.push(item[1]);
|
||||
});
|
||||
|
||||
// Get item's name for Current Inventory
|
||||
arr1.map(function(item) {
|
||||
arrCurInvName.push(item[1]);
|
||||
});
|
||||
// Get item's name for Current Inventory
|
||||
arr1.map(function(item) {
|
||||
arrCurInvName.push(item[1]);
|
||||
});
|
||||
|
||||
// Add new inventory items to current inventory.
|
||||
arrNeInvName.map(function(item) {
|
||||
if (arrCurInvName.indexOf(item) === -1) {
|
||||
index = arrNeInvName.indexOf(item);
|
||||
arr1.push(arr2[index]);
|
||||
}
|
||||
});
|
||||
|
||||
// Sort the array alphabetically using the second element of the array as base.
|
||||
arr1.sort(function(currItem, nextItem) {
|
||||
|
||||
//Ternary function to avoid using if else
|
||||
return currItem[1] > nextItem[1] ? 1 : -1;
|
||||
});
|
||||
|
||||
return arr1;
|
||||
// Add new inventory items to current inventory.
|
||||
arrNeInvName.map(function(item) {
|
||||
if (arrCurInvName.indexOf(item) === -1) {
|
||||
index = arrNeInvName.indexOf(item);
|
||||
arr1.push(arr2[index]);
|
||||
}
|
||||
});
|
||||
|
||||
// test here
|
||||
// Example inventory lists
|
||||
var curInv = [
|
||||
[21, "Bowling Ball"],
|
||||
[2, "Dirty Sock"],
|
||||
[1, "Hair Pin"],
|
||||
[5, "Microphone"]
|
||||
];
|
||||
// Sort the array alphabetically using the second element of the array as base.
|
||||
arr1.sort(function(currItem, nextItem) {
|
||||
//Ternary function to avoid using if else
|
||||
return currItem[1] > nextItem[1] ? 1 : -1;
|
||||
});
|
||||
|
||||
var newInv = [
|
||||
[2, "Hair Pin"],
|
||||
[3, "Half-Eaten Apple"],
|
||||
[67, "Bowling Ball"],
|
||||
[7, "Toothpaste"]
|
||||
];
|
||||
return arr1;
|
||||
}
|
||||
|
||||
updateInventory(curInv, newInv);
|
||||
// test here
|
||||
// Example inventory lists
|
||||
var curInv = [
|
||||
[21, "Bowling Ball"],
|
||||
[2, "Dirty Sock"],
|
||||
[1, "Hair Pin"],
|
||||
[5, "Microphone"]
|
||||
];
|
||||
|
||||
var newInv = [
|
||||
[2, "Hair Pin"],
|
||||
[3, "Half-Eaten Apple"],
|
||||
[67, "Bowling Ball"],
|
||||
[7, "Toothpaste"]
|
||||
];
|
||||
|
||||
updateInventory(curInv, newInv);
|
||||
```
|
||||
|
||||
|
||||
### Code Explanation:
|
||||
#### Code Explanation
|
||||
|
||||
* The variable **index** stores the location (index) of a product.
|
||||
* **arrCurInvName** has the names of **arr1**'s items.
|
||||
@@ -207,66 +202,64 @@ Return the completed inventory in alphabetical order.
|
||||
* <a href='http://forum.freecodecamp.com/t/javascript-array-prototype-indexof/14291' target='_blank' rel='nofollow'>JS Array.prototype.indexOf()</a>
|
||||
* <a href='http://forum.freecodecamp.com/t/javascript-ternary-operator/15973' target='_blank' rel='nofollow'>JS Ternary Operator</a>
|
||||
|
||||
##  Advanced Code Solution:
|
||||
</details>
|
||||
|
||||
<details><summary>Solution 3 (Click to Show/Hide)</summary>
|
||||
|
||||
```javascript
|
||||
function updateInventory(arr1, arr2) {
|
||||
// All inventory must be accounted for or you're fired!
|
||||
function updateInventory(arr1, arr2) {
|
||||
// All inventory must be accounted for or you're fired!
|
||||
|
||||
// convert current inventory (arr1) to an one-dimensional array
|
||||
const inventory = Array.prototype.concat.apply([], arr1);
|
||||
// convert current inventory (arr1) to an one-dimensional array
|
||||
const inventory = Array.prototype.concat.apply([], arr1);
|
||||
|
||||
// loop through new delivery (arr2)
|
||||
for (let i = 0; i < arr2.length; i++) {
|
||||
// loop through new delivery (arr2)
|
||||
for (let i = 0; i < arr2.length; i++) {
|
||||
// extract item properties for easy reference
|
||||
const item = arr2[i][1];
|
||||
const quantity = arr2[i][0];
|
||||
|
||||
// extract item properties for easy reference
|
||||
const item = arr2[i][1];
|
||||
const quantity = arr2[i][0];
|
||||
|
||||
// check if item already exists in inventory
|
||||
const position = inventory.indexOf(item);
|
||||
|
||||
// exsisting item: update quantity
|
||||
if (position !== -1) {
|
||||
const row = Math.floor(position / 2);
|
||||
arr1[row][0] += quantity;
|
||||
continue;
|
||||
}
|
||||
|
||||
// alien item: add to inventory
|
||||
arr1.push([quantity, item]);
|
||||
|
||||
}
|
||||
|
||||
// sort inventory in alphabetical order
|
||||
arr1.sort((previous, next) => (previous[1] > [next[1]]) ? 1 : -1);
|
||||
|
||||
return arr1;
|
||||
// check if item already exists in inventory
|
||||
const position = inventory.indexOf(item);
|
||||
|
||||
// exsisting item: update quantity
|
||||
if (position !== -1) {
|
||||
const row = Math.floor(position / 2);
|
||||
arr1[row][0] += quantity;
|
||||
continue;
|
||||
}
|
||||
|
||||
// alien item: add to inventory
|
||||
arr1.push([quantity, item]);
|
||||
}
|
||||
|
||||
// test here
|
||||
// Example inventory lists
|
||||
var curInv = [
|
||||
[21, "Bowling Ball"],
|
||||
[2, "Dirty Sock"],
|
||||
[1, "Hair Pin"],
|
||||
[5, "Microphone"]
|
||||
];
|
||||
// sort inventory in alphabetical order
|
||||
arr1.sort((previous, next) => (previous[1] > [next[1]] ? 1 : -1));
|
||||
|
||||
var newInv = [
|
||||
[2, "Hair Pin"],
|
||||
[3, "Half-Eaten Apple"],
|
||||
[67, "Bowling Ball"],
|
||||
[7, "Toothpaste"]
|
||||
];
|
||||
return arr1;
|
||||
}
|
||||
|
||||
updateInventory(curInv, newInv);
|
||||
// test here
|
||||
// Example inventory lists
|
||||
var curInv = [
|
||||
[21, "Bowling Ball"],
|
||||
[2, "Dirty Sock"],
|
||||
[1, "Hair Pin"],
|
||||
[5, "Microphone"]
|
||||
];
|
||||
|
||||
var newInv = [
|
||||
[2, "Hair Pin"],
|
||||
[3, "Half-Eaten Apple"],
|
||||
[67, "Bowling Ball"],
|
||||
[7, "Toothpaste"]
|
||||
];
|
||||
|
||||
updateInventory(curInv, newInv);
|
||||
```
|
||||
|
||||
|
||||
### Code Explanation:
|
||||
#### Code Explanation
|
||||
|
||||
* Convert current inventory array **arr1** to an one-dimensional array in order that `indexOf()` method could be used to check existance of new delivery items in current inventory.
|
||||
* Check if item already exists in current inventory using `indexOf()`.
|
||||
@@ -279,9 +272,5 @@ Return the completed inventory in alphabetical order.
|
||||
* <a href='https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply'>JS Function.prototype.apply()</a>
|
||||
* <a href='https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/continue' target='_blank' rel='nofollow'>JS continue</a>
|
||||
* <a href='https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort' target='_blank' rel='nofollow'>JS Array.prototype.sort()</a>
|
||||
</details>
|
||||
|
||||
##  NOTES FOR CONTRIBUTIONS:
|
||||
|
||||
*  **DO NOT** add solutions that are similar to any existing solutions. If you think it is **_similar but better_**, then try to merge (or replace) the existing similar solution.
|
||||
* Add an explanation of your solution.
|
||||
* Categorize the solution in one of the following categories — **Basic**, **Intermediate** and **Advanced**. 
|
||||
|
||||
Reference in New Issue
Block a user