Need help understanding why I'm required to use JSON.parse() - javascript
I have an assignment for my current web development course, my issue is that I cannot see why I need to use JSON.parse() (it's a requirement though). I can guess where it would be used but with experimentation have not managed to render any results.
The general idea is we are drawing information from a JSON array in a separate file (on the same server obviously). This is done through a function contained in an ajax.js file written by the lecturer which is relatively straight forward as follows:
function getJSON(url, callbackFunction) {
//var request = new XMLHttpRequest();
var request = new XMLHttpRequest();
// Work around for browser caching problem that affects some browsers. It prevents
// the browser from using a cached copy that was stored by the browser from another visit.
if (url.indexOf('?') < 0) {
today = new Date();// Add a unique query string to the end of the url
// representing the current time to force the browser to fetch the data
// rather than using a locally cached copy that the browser fetched some earlier time.
url += '?' + today.getTime();
}
request.onreadystatechange = function (){
if (request.readyState === 4 && request.status===200) {
alert("Response Status = " + request.status); // You can safely comment out this line
alert("response = " + request.response); // You can safely comment out this line
alert("response headers = " + request.getAllResponseHeaders()); // You can safely comment out this line
callbackFunction(request.response);
}
};
try {
request.open("POST", url);
request.responseType ="json";
request.send();
}
catch ( exception ) {
alert(exception);
}
}
It uses an XMLHTTPRequest function.
The callback function in this case is as follows at present:
function displayAllGames(results) {
alert('ready to start work');
var gamesArray = results.games;
var myHTML = '<table id="table1" border="1">';
for (var counter = 0; counter < gamesArray.length; counter++) {
var game = gamesArray[counter];
var venue = game.venue;
var round = game.round;
var date = new Date(game.date);
var homeTeam = game.homeTeam.name;
var awayTeam = game.awayTeam.name;
myHTML += '<tr>';
myHTML += '<td>' + round + '</td>';
myHTML += '<td>' + venue + '</td>';
myHTML += '<td>' + date.toLocaleDateString() + '</td>';
myHTML += '<td>' + homeTeam + '</td>';
myHTML += '<td>' + awayTeam + '</td>';
myHTML += '</tr>';
}
myHTML += '</table>';
var targetElement = document.getElementById('happyPlace');
targetElement.innerHTML = myHTML;
}
When adding code for a JSON.parse() even as an extra at the end of the document nothing happens. The code as follows:
var parsedData = JSON.parse(gamesArray);
alert(parsedData[1]);
However no alert comes up and even when trying to write the single item to the end of the document with document.write nothing occurs. Can someone please explain what I'm doing wrong? It's driving me nuts.
JSON Content:
{
"games": [
{
"round": 1,
"date": "Fri, 3 Apr 2015 14:20:00",
"venue": "Maryborough",
"homeTeam":
{
"name": "Maryborough",
"goals": 11,
"points": 9
},
"awayTeam":
{
"name": "Castlemaine",
"goals": 24,
"points": 10
}
},
{
"round": 1,
"date": "Fri, 3 Apr 2015 14:20:00",
"venue": "Eaglehawk",
"homeTeam":
{
"name": "Eaglehawk",
"goals": 18,
"points": 19
},
"awayTeam":
{
"name": "South Bendigo",
"goals": 3,
"points": 7
}
},
{
"round": 1,
"date": "Fri, 3 Apr 2015 14:20:00",
"venue": "Gisborne",
"homeTeam":
{
"name": "Gisborne",
"goals": 10,
"points": 5
},
"awayTeam":
{
"name": "Kyneton",
"goals": 19,
"points": 11
}
},
{
"round": 1,
"date": "Fri, 3 Apr 2015 14:20:00",
"venue": "Golden Square",
"homeTeam":
{
"name": "Golden Square",
"goals": 16,
"points": 10
},
"awayTeam":
{
"name": "Kangaroo Flat",
"goals": 9,
"points": 10
}
},
{
"round": 1,
"date": "Fri, 3 Apr 2015 17:30:00",
"venue": "Queen Elizabeth Oval",
"homeTeam":
{
"name": "Sandhurst",
"goals": 10,
"points": 9
},
"awayTeam":
{
"name": "Strathfieldsaye",
"goals": 11,
"points": 16
}
},
{
"round": 2,
"date": "Sat, 11 Apr 2015 14:20:00",
"venue": "Gisborne",
"homeTeam":
{
"name": "Gisborne",
"goals": 25,
"points": 22
},
"awayTeam":
{
"name": "Maryborough",
"goals": 7,
"points": 3
}
},
{
"round": 2,
"date": "Sat, 11 Apr 2015 14:20:00",
"venue": "Kennington",
"homeTeam":
{
"name": "South Bendigo",
"goals": 10,
"points": 6
},
"awayTeam":
{
"name": "Golden Square",
"goals": 15,
"points": 18
}
},
{
"round": 2,
"date": "Sat, 11 Apr 2015 14:20:00",
"venue": "Kyneton",
"homeTeam":
{
"name": "Kyneton",
"goals": 15,
"points": 11
},
"awayTeam":
{
"name": "Sandhurst",
"goals": 22,
"points": 30
}
},
{
"round": 2,
"date": "Sat, 11 Apr 2015 17:30:00",
"venue": "Kangaroo Flat",
"homeTeam":
{
"name": "Kangaroo Flat",
"goals": 12,
"points": 12
},
"awayTeam":
{
"name": "Castlemaine",
"goals": 11,
"points": 10
}
},
{
"round": 2,
"date": "Sun, 12 Apr 2015 14:20:00",
"venue": "Strathfieldsaye",
"homeTeam":
{
"name": "Strathfieldsaye",
"goals": 16,
"points": 16
},
"awayTeam":
{
"name": "Eaglehawk",
"goals": 11,
"points": 7
}
},
{
"round": 3,
"date": "Sat, 18 Apr 2015 14:20:00",
"venue": "Maryborough",
"homeTeam":
{
"name": "Maryborough",
"goals": 12,
"points": 14
},
"awayTeam":
{
"name": "Kangaroo Flat",
"goals": 14,
"points": 13
}
},
{
"round": 3,
"date": "Sat, 18 Apr 2015 14:20:00",
"venue": "Castlemaine",
"homeTeam":
{
"name": "Castlemaine",
"goals": 12,
"points": 13
},
"awayTeam":
{
"name": "Gisborne",
"goals": 10,
"points": 10
}
},
{
"round": 3,
"date": "Sat, 18 Apr 2015 14:20:00",
"venue": "Eaglehawk",
"homeTeam":
{
"name": "Eaglehawk",
"goals": 20,
"points": 21
},
"awayTeam":
{
"name": "Kyneton",
"goals": 10,
"points": 8
}
},
{
"round": 3,
"date": "Sat, 18 Apr 2015 14:20:00",
"venue": "Golden Square",
"homeTeam":
{
"name": "Golden Square",
"goals": 6,
"points": 8
},
"awayTeam":
{
"name": "Strathfieldsaye",
"goals": 13,
"points": 13
}
},
{
"round": 3,
"date": "Sat, 18 Apr 2015 14:20:00",
"venue": "Queen Elizabeth Oval",
"homeTeam":
{
"name": "Sandhurst",
"goals": 20,
"points": 17
},
"awayTeam":
{
"name": "South Bendigo",
"goals": 8,
"points": 3
}
},
{
"round": 4,
"date": "Sat, 25 Apr 2015 14:20:00",
"venue": "Maryborough",
"homeTeam":
{
"name": "Maryborough",
"goals": 9,
"points": 4
},
"awayTeam":
{
"name": "Sandhurst",
"goals": 25,
"points": 26
}
},
{
"round": 4,
"date": "Sat, 25 Apr 2015 14:20:00",
"venue": "Eaglehawk",
"homeTeam":
{
"name": "Eaglehawk",
"goals": 26,
"points": 14
},
"awayTeam":
{
"name": "Kangaroo Flat",
"goals": 7,
"points": 3
}
},
{
"round": 4,
"date": "Sat, 25 Apr 2015 14:20:00",
"venue": "Strathfieldsaye",
"homeTeam":
{
"name": "Strathfieldsaye",
"goals": 10,
"points": 15
},
"awayTeam":
{
"name": "Castlemaine",
"goals": 3,
"points": 6
}
},
{
"round": 4,
"date": "Sat, 25 Apr 2015 14:20:00",
"venue": "Gisborne",
"homeTeam":
{
"name": "Gisborne",
"goals": 9,
"points": 13
},
"awayTeam":
{
"name": "Golden Square",
"goals": 11,
"points": 10
}
},
{
"round": 4,
"date": "Sat, 25 Apr 2015 17:30:00",
"venue": "Queen Elizabeth Oval",
"homeTeam":
{
"name": "South Bendigo",
"goals": 6,
"points": 11
},
"awayTeam":
{
"name": "Kyneton",
"goals": 10,
"points": 11
}
},
{
"round": 5,
"date": "Sat, 2 May 2015 14:20:00",
"venue": "Castlemaine",
"homeTeam":
{
"name": "Castlemaine",
"goals": 10,
"points": 8
},
"awayTeam":
{
"name": "Eaglehawk",
"goals": 9,
"points": 15
}
},
{
"round": 5,
"date": "Sat, 2 May 2015 14:20:00",
"venue": "Strathfieldsaye",
"homeTeam":
{
"name": "Strathfieldsaye",
"goals": 24,
"points": 24
},
"awayTeam":
{
"name": "Maryborough",
"goals": 5,
"points": 2
}
},
{
"round": 5,
"date": "Sat, 2 May 2015 14:20:00",
"venue": "Golden Square",
"homeTeam":
{
"name": "Golden Square",
"goals": 17,
"points": 10
},
"awayTeam":
{
"name": "Kyneton",
"goals": 7,
"points": 6
}
},
{
"round": 5,
"date": "Sat, 2 May 2015 14:20:00",
"venue": "Queen Elizabeth Oval",
"homeTeam":
{
"name": "South Bendigo",
"goals": 12,
"points": 19
},
"awayTeam":
{
"name": "Gisborne",
"goals": 4,
"points": 6
}
},
{
"round": 5,
"date": "Sat, 2 May 2015 17:30:00",
"venue": "Kangaroo Flat",
"homeTeam":
{
"name": "Kangaroo Flat",
"goals": 7,
"points": 8
},
"awayTeam":
{
"name": "Sandhurst",
"goals": 17,
"points": 24
}
},
{
"round": 6,
"date": "Sat, 9 May 2015 14:20:00",
"venue": "Maryborough",
"homeTeam":
{
"name": "Maryborough",
"goals": 6,
"points": 6
},
"awayTeam":
{
"name": "Golden Square",
"goals": 27,
"points": 26
}
},
{
"round": 6,
"date": "Sat, 9 May 2015 14:20:00",
"venue": "Kangaroo Flat",
"homeTeam":
{
"name": "Kangaroo Flat",
"goals": 11,
"points": 9
},
"awayTeam":
{
"name": "South Bendigo",
"goals": 8,
"points": 11
}
},
{
"round": 6,
"date": "Sat, 9 May 2015 14:20:00",
"venue": "Gisborne",
"homeTeam":
{
"name": "Gisborne",
"goals": 9,
"points": 4
},
"awayTeam":
{
"name": "Eaglehawk",
"goals": 19,
"points": 17
}
},
{
"round": 6,
"date": "Sat, 9 May 2015 14:20:00",
"venue": "Kyneton",
"homeTeam":
{
"name": "Kyneton",
"goals": 5,
"points": 8
},
"awayTeam":
{
"name": "Strathfieldsaye",
"goals": 20,
"points": 18
}
},
{
"round": 6,
"date": "Sun, 10 May 2015 14:20:00",
"venue": "Queen Elizabeth Oval",
"homeTeam":
{
"name": "Sandhurst",
"goals": 16,
"points": 17
},
"awayTeam":
{
"name": "Castlemaine",
"goals": 3,
"points": 7
}
},
{
"round": 7,
"date": "Sat, 16 May 2015 14:20:00",
"venue": "Kangaroo Flat",
"homeTeam":
{
"name": "Kangaroo Flat",
"goals": 9,
"points": 12
},
"awayTeam":
{
"name": "Strathfieldsaye",
"goals": 13,
"points": 11
}
},
{
"round": 7,
"date": "Sat, 16 May 2015 14:20:00",
"venue": "Castlemaine",
"homeTeam":
{
"name": "Castlemaine",
"goals": 18,
"points": 9
},
"awayTeam":
{
"name": "Kyneton",
"goals": 21,
"points": 13
}
},
{
"round": 7,
"date": "Sat, 16 May 2015 14:20:00",
"venue": "Eaglehawk",
"homeTeam":
{
"name": "Eaglehawk",
"goals": 8,
"points": 11
},
"awayTeam":
{
"name": "Golden Square",
"goals": 10,
"points": 14
}
},
{
"round": 7,
"date": "Sat, 16 May 2015 14:20:00",
"venue": "Gisborne",
"homeTeam":
{
"name": "Gisborne",
"goals": 1,
"points": 4
},
"awayTeam":
{
"name": "Sandhurst",
"goals": 17,
"points": 25
}
},
{
"round": 7,
"date": "Sat, 16 May 2015 14:20:00",
"venue": "Queen Elizabeth Oval",
"homeTeam":
{
"name": "South Bendigo",
"goals": 25,
"points": 18
},
"awayTeam":
{
"name": "Maryborough",
"goals": 5,
"points": 6
}
}
}
From what I can understand you should use JSON.parse if the results is not an object, but a string variable holding a valid JSON. This way you could use the Javacript object and do whatever you like.
Related
Rearrange list of JavaScript array of objects with children list into one object with the parent details inserted inside the child list
for example, let's say I have the below array of javascript objects that has a parent list and child list... let accessories = [ { "storeid": "1", "storename": "Novare station one", "computers": [ { "name": "Elite book", "status": "available", "date": "Tue Jun 14 2022" }, { "name": "HP Envy", "status": "available", "date": "Tue Jun 14 2022" }, { "name": "Macbook Pro", "status": "available", "date": "Sat Jul 02 2022" } ] }, { "storeid": "2", "storename": "Novare central", "computers": [ { "name": "HP workstation", "status": "available", "date": "Wed Jul 06 2022" }, { "name": "Macbook air", "status": "available", "date": "Wed Jul 06 2022" } ] } ] And I want to rearrange the above list to form the below single object with the parent object details added to the child list let accessories = [ { "storeid": "1", "storename": "Novare station one", "name": "Elite book", "status": "available", "date": "Tue Jun 14 2022" }, { "storeid": "1", "storename": "Novare station one", "name": "HP Envy", "status": "available", "date": "Tue Jun 14 2022" }, { "storeid": "1", "storename": "Novare station one", "name": "Macbook Pro", "status": "available", "date": "Sat Jul 02 2022" }, { "storeid": "2", "storename": "Novare central", "name": "HP workstation", "status": "available", "date": "Wed Jul 06 2022" }, { "storeid": "2", "storename": "Novare central", "name": "Macbook air", "status": "available", "date": "Wed Jul 06 2022" }, ] I don't know if this is even possible but any assistance will be highly appreciated.
You can try below code it should work for you. const accessories = [ { "storeid": "1", "storename": "Novare station one", "computers": [ { "name": "Elite book", "status": "available", "date": "Tue Jun 14 2022" }, { "name": "HP Envy", "status": "available", "date": "Tue Jun 14 2022" }, { "name": "Macbook Pro", "status": "available", "date": "Sat Jul 02 2022" } ] }, { "storeid": "2", "storename": "Novare central", "computers": [ { "name": "HP workstation", "status": "available", "date": "Wed Jul 06 2022" }, { "name": "Macbook air", "status": "available", "date": "Wed Jul 06 2022" } ] } ] const mappedData = []; (accessories || []).forEach(item => { const values = item.computers; values.forEach(value => (mappedData.push({ storeid: item.storeid, storename: item.storename, name: value.name, status: value.status, date: value.date, }))) }); console.log("accessoriesMappedData", mappedData)
you can combine use flatMap and map same as : let accessories = [ { "storeid": "1", "storename": "Novare station one", "computers": [ { "name": "Elite book", "status": "available", "date": "Tue Jun 14 2022" }, { "name": "HP Envy", "status": "available", "date": "Tue Jun 14 2022" }, { "name": "Macbook Pro", "status": "available", "date": "Sat Jul 02 2022" } ] }, { "storeid": "2", "storename": "Novare central", "computers": [ { "name": "HP workstation", "status": "available", "date": "Wed Jul 06 2022" }, { "name": "Macbook air", "status": "available", "date": "Wed Jul 06 2022" } ] } ] const result = accessories.flatMap(({computers, ...rest}) => computers.map(ele => ({...rest, ...ele}))) console.log(result)
const accessories = [ { 'storeid': '1', 'storename': 'Novare station one', 'computers': [ { 'name': 'Elite book', 'status': 'available', 'date': 'Tue Jun 14 2022' }, { 'name': 'HP Envy', 'status': 'available', 'date': 'Tue Jun 14 2022' }, { 'name': 'Macbook Pro', 'status': 'available', 'date': 'Sat Jul 02 2022' } ] }, { 'storeid': '2', 'storename': 'Novare central', 'computers': [ { 'name': 'HP workstation', 'status': 'available', 'date': 'Wed Jul 06 2022' }, { 'name': 'Macbook air', 'status': 'available', 'date': 'Wed Jul 06 2022' } ] } ] const result = accessories.flatMap(item => item.computers.map(element => Object.assign({ 'storeid': item['storeid'], 'storename': item['storename'] }, element) ) ) console.log(result)
Selection from JSON
I recently started learning JavaScript and faced a task that I can't complete in any way, every time I get the wrong data that I need There is an object that contains data on banking transactions, I need to make a selection and form a new object using filter, map or reduce: We assume that the initial balance on the card = 0. Output the TOP 3 months with the largest number of operations by month. Formalize it as a task_1(arr) function, where arr is the source array with data for all months. Output format: [ { year: 2019, month: 11, opsCount: 27 }, { year: 2019, month: 10, opsCount: 26 }, { year: 2019, month: 8, opsCount: 24 } ] Output statistics for the end of the specified month. monthmonthBalance - own balance by month = The amount of all deposits minus the amount of all debits montWithdrawal – total cash withdrawal amount withdrawalRate – the share of the total amount of debits from the total amount of deposits per month. rank – user status calculated by the formula: Gold if withdrawalRate < 0.15. Silver if withdrawalRate < 0.3. Bronze in all other cases. Formalize it as a task_2(year, month, arr) function, where year, month is the desired one month, and arr is the original array with all the data by month. Output format: { date: '2019-01-31’, monthBalance: 3829, monthWithrawal: 33800, withdrawalRate: 0.3133 rank: 'Bronze’ } Calculate statistics from task 2 for all months of the period. Add a field to each month totalBalance - cumulative balance = Own balance for the month + Balance for the cumulative balance for the previous month. Output format: [ { date: '2019-01-31’, monthBalance: 3829, totalBalance: 3829, monthWithrawal: 33800, withdrawalRate: 0.3133 rank: ’Bronze' }, ... ] Formalize it as a task_3(arr) function, where arr is the source array with data. JSON with data: [ { "year": 2019, "month": 1, "day": 1, "type": "replenishment", "amount": 79817 }, { "year": 2019, "month": 1, "day": 3, "type": "payment", "amount": 11334 }, { "year": 2019, "month": 1, "day": 5, "type": "withdrawal", "amount": 26700 }, { "year": 2019, "month": 1, "day": 5, "type": "payment", "amount": 15475 }, { "year": 2019, "month": 1, "day": 6, "type": "payment", "amount": 4818 }, { "year": 2019, "month": 1, "day": 6, "type": "payment", "amount": 1893 }, { "year": 2019, "month": 1, "day": 7, "type": "payment", "amount": 3844 }, { "year": 2019, "month": 1, "day": 7, "type": "withdrawal", "amount": 3100 }, { "year": 2019, "month": 1, "day": 7, "type": "payment", "amount": 3230 }, { "year": 2019, "month": 1, "day": 7, "type": "payment", "amount": 2427 }, { "year": 2019, "month": 1, "day": 9, "type": "replenishment", "amount": 15835 }, { "year": 2019, "month": 1, "day": 10, "type": "payment", "amount": 9670 }, { "year": 2019, "month": 1, "day": 11, "type": "payment", "amount": 582 }, { "year": 2019, "month": 1, "day": 11, "type": "withdrawal", "amount": 1100 }, { "year": 2019, "month": 1, "day": 11, "type": "replenishment", "amount": 5971 }, { "year": 2019, "month": 1, "day": 12, "type": "payment", "amount": 173 }, { "year": 2019, "month": 1, "day": 14, "type": "withdrawal", "amount": 1500 }, { "year": 2019, "month": 1, "day": 14, "type": "payment", "amount": 3641 }, { "year": 2019, "month": 1, "day": 16, "type": "payment", "amount": 4669 }, { "year": 2019, "month": 1, "day": 18, "type": "payment", "amount": 2460 }, { "year": 2019, "month": 1, "day": 19, "type": "payment", "amount": 1307 }, { "year": 2019, "month": 1, "day": 20, "type": "withdrawal", "amount": 1400 }, { "year": 2019, "month": 1, "day": 21, "type": "payment", "amount": 952 }, { "year": 2019, "month": 1, "day": 21, "type": "payment", "amount": 561 }, { "year": 2019, "month": 1, "day": 21, "type": "replenishment", "amount": 6236 }, { "year": 2019, "month": 1, "day": 22, "type": "payment", "amount": 888 }, { "year": 2019, "month": 1, "day": 22, "type": "payment", "amount": 2306 }, { "year": 2019, "month": 2, "day": 1, "type": "replenishment", "amount": 84839 }, { "year": 2019, "month": 2, "day": 1, "type": "withdrawal", "amount": 27700 }, { "year": 2019, "month": 2, "day": 1, "type": "payment", "amount": 11145 }, { "year": 2019, "month": 2, "day": 2, "type": "payment", "amount": 4075 }, { "year": 2019, "month": 2, "day": 4, "type": "withdrawal", "amount": 10900 }, { "year": 2019, "month": 2, "day": 6, "type": "payment", "amount": 10537 }, { "year": 2019, "month": 2, "day": 6, "type": "payment", "amount": 6001 }, { "year": 2019, "month": 2, "day": 7, "type": "withdrawal", "amount": 7300 }, { "year": 2019, "month": 2, "day": 10, "type": "withdrawal", "amount": 1500 }, { "year": 2019, "month": 2, "day": 10, "type": "payment", "amount": 3584 }, { "year": 2019, "month": 2, "day": 11, "type": "payment", "amount": 701 }, { "year": 2019, "month": 3, "day": 1, "type": "replenishment", "amount": 84771 }, { "year": 2019, "month": 3, "day": 3, "type": "withdrawal", "amount": 22700 }, { "year": 2019, "month": 3, "day": 5, "type": "payment", "amount": 12352 }, { "year": 2019, "month": 3, "day": 8, "type": "payment", "amount": 2795 }, { "year": 2019, "month": 3, "day": 11, "type": "withdrawal", "amount": 16600 }, { "year": 2019, "month": 3, "day": 11, "type": "replenishment", "amount": 4141 }, { "year": 2019, "month": 3, "day": 11, "type": "payment", "amount": 9854 }, { "year": 2019, "month": 3, "day": 13, "type": "withdrawal", "amount": 1200 }, { "year": 2019, "month": 3, "day": 14, "type": "payment", "amount": 11573 }, { "year": 2019, "month": 3, "day": 14, "type": "payment", "amount": 5138 }, { "year": 2019, "month": 3, "day": 15, "type": "payment", "amount": 731 }, { "year": 2019, "month": 3, "day": 17, "type": "payment", "amount": 5053 }, { "year": 2019, "month": 3, "day": 19, "type": "withdrawal", "amount": 400 }, { "year": 2019, "month": 3, "day": 20, "type": "payment", "amount": 1745 }, { "year": 2019, "month": 3, "day": 20, "type": "payment", "amount": 602 }, { "year": 2019, "month": 3, "day": 21, "type": "payment", "amount": 178 }, { "year": 2019, "month": 3, "day": 22, "type": "payment", "amount": 353 }, { "year": 2019, "month": 3, "day": 23, "type": "payment", "amount": 837 }, { "year": 2019, "month": 3, "day": 23, "type": "payment", "amount": 330 }, { "year": 2019, "month": 3, "day": 23, "type": "payment", "amount": 799 }, { "year": 2019, "month": 3, "day": 24, "type": "payment", "amount": 294 }, { "year": 2019, "month": 3, "day": 24, "type": "payment", "amount": 260 }, { "year": 2019, "month": 3, "day": 25, "type": "withdrawal", "amount": 200 }, { "year": 2019, "month": 4, "day": 1, "type": "replenishment", "amount": 88656 }, { "year": 2019, "month": 4, "day": 4, "type": "payment", "amount": 37852 }, { "year": 2019, "month": 4, "day": 7, "type": "payment", "amount": 9365 }, { "year": 2019, "month": 4, "day": 8, "type": "payment", "amount": 16701 }, { "year": 2019, "month": 4, "day": 11, "type": "payment", "amount": 8979 }, { "year": 2019, "month": 4, "day": 11, "type": "payment", "amount": 1971 }, { "year": 2019, "month": 4, "day": 13, "type": "payment", "amount": 1261 }, { "year": 2019, "month": 4, "day": 13, "type": "withdrawal", "amount": 800 }, { "year": 2019, "month": 4, "day": 15, "type": "payment", "amount": 5553 }, { "year": 2019, "month": 4, "day": 17, "type": "payment", "amount": 2593 }, { "year": 2019, "month": 4, "day": 18, "type": "replenishment", "amount": 6915 }, { "year": 2019, "month": 4, "day": 19, "type": "replenishment", "amount": 17647 }, { "year": 2019, "month": 4, "day": 21, "type": "payment", "amount": 13814 }, { "year": 2019, "month": 4, "day": 22, "type": "payment", "amount": 2707 }, { "year": 2019, "month": 4, "day": 22, "type": "withdrawal", "amount": 1300 }, { "year": 2019, "month": 4, "day": 22, "type": "withdrawal", "amount": 2900 }, { "year": 2019, "month": 4, "day": 23, "type": "replenishment", "amount": 10709 }, { "year": 2019, "month": 4, "day": 23, "type": "payment", "amount": 686 }, { "year": 2019, "month": 4, "day": 23, "type": "withdrawal", "amount": 5100 }, { "year": 2019, "month": 4, "day": 23, "type": "payment", "amount": 3830 }, { "year": 2019, "month": 5, "day": 1, "type": "replenishment", "amount": 59877 }, { "year": 2019, "month": 5, "day": 2, "type": "payment", "amount": 14095 }, { "year": 2019, "month": 5, "day": 5, "type": "payment", "amount": 10858 }, { "year": 2019, "month": 5, "day": 8, "type": "payment", "amount": 9412 }, { "year": 2019, "month": 5, "day": 11, "type": "replenishment", "amount": 6892 }, { "year": 2019, "month": 5, "day": 11, "type": "payment", "amount": 17541 }, { "year": 2019, "month": 5, "day": 11, "type": "payment", "amount": 2666 }, { "year": 2019, "month": 5, "day": 11, "type": "payment", "amount": 3935 }, { "year": 2019, "month": 5, "day": 12, "type": "withdrawal", "amount": 2600 }, { "year": 2019, "month": 5, "day": 14, "type": "payment", "amount": 2096 }, { "year": 2019, "month": 5, "day": 14, "type": "replenishment", "amount": 2733 }, { "year": 2019, "month": 5, "day": 15, "type": "replenishment", "amount": 538 }, { "year": 2019, "month": 5, "day": 15, "type": "payment", "amount": 5324 }, { "year": 2019, "month": 5, "day": 15, "type": "payment", "amount": 2490 }, { "year": 2019, "month": 5, "day": 15, "type": "payment", "amount": 3510 }, { "year": 2019, "month": 5, "day": 17, "type": "withdrawal", "amount": 300 }, { "year": 2019, "month": 5, "day": 17, "type": "payment", "amount": 133 }, { "year": 2019, "month": 6, "day": 1, "type": "replenishment", "amount": 89064 }, { "year": 2019, "month": 6, "day": 2, "type": "payment", "amount": 7613 }, { "year": 2019, "month": 6, "day": 2, "type": "payment", "amount": 33742 }, { "year": 2019, "month": 6, "day": 5, "type": "withdrawal", "amount": 7200 }, { "year": 2019, "month": 6, "day": 6, "type": "payment", "amount": 15125 }, { "year": 2019, "month": 6, "day": 9, "type": "payment", "amount": 3379 }, { "year": 2019, "month": 6, "day": 10, "type": "payment", "amount": 1260 }, { "year": 2019, "month": 6, "day": 12, "type": "payment", "amount": 11066 }, { "year": 2019, "month": 6, "day": 12, "type": "replenishment", "amount": 7050 }, { "year": 2019, "month": 6, "day": 12, "type": "payment", "amount": 7531 }, { "year": 2019, "month": 6, "day": 13, "type": "payment", "amount": 4776 }, { "year": 2019, "month": 6, "day": 13, "type": "replenishment", "amount": 4456 }, { "year": 2019, "month": 6, "day": 14, "type": "replenishment", "amount": 7998 }, { "year": 2019, "month": 6, "day": 16, "type": "payment", "amount": 2437 }, { "year": 2019, "month": 6, "day": 16, "type": "replenishment", "amount": 11729 }, { "year": 2019, "month": 6, "day": 18, "type": "payment", "amount": 11216 }, { "year": 2019, "month": 6, "day": 19, "type": "payment", "amount": 3420 }, { "year": 2019, "month": 6, "day": 19, "type": "payment", "amount": 1339 }, { "year": 2019, "month": 6, "day": 20, "type": "payment", "amount": 5578 }, { "year": 2019, "month": 6, "day": 21, "type": "withdrawal", "amount": 1600 }, { "year": 2019, "month": 6, "day": 21, "type": "withdrawal", "amount": 400 }, { "year": 2019, "month": 7, "day": 1, "type": "replenishment", "amount": 51749 }, { "year": 2019, "month": 7, "day": 2, "type": "payment", "amount": 2875 }, { "year": 2019, "month": 7, "day": 2, "type": "payment", "amount": 10315 }, { "year": 2019, "month": 7, "day": 5, "type": "payment", "amount": 18501 }, { "year": 2019, "month": 7, "day": 5, "type": "payment", "amount": 12728 }, { "year": 2019, "month": 7, "day": 7, "type": "payment", "amount": 4505 }, { "year": 2019, "month": 7, "day": 8, "type": "payment", "amount": 2758 }, { "year": 2019, "month": 7, "day": 8, "type": "payment", "amount": 60 }, { "year": 2019, "month": 7, "day": 10, "type": "withdrawal", "amount": 1100 }, { "year": 2019, "month": 7, "day": 12, "type": "withdrawal", "amount": 1000 }, { "year": 2019, "month": 7, "day": 13, "type": "payment", "amount": 151 }, { "year": 2019, "month": 8, "day": 1, "type": "replenishment", "amount": 85156 }, { "year": 2019, "month": 8, "day": 1, "type": "payment", "amount": 33978 }, { "year": 2019, "month": 8, "day": 2, "type": "payment", "amount": 6548 }, { "year": 2019, "month": 8, "day": 3, "type": "payment", "amount": 5909 }, { "year": 2019, "month": 8, "day": 6, "type": "payment", "amount": 2326 }, { "year": 2019, "month": 8, "day": 6, "type": "payment", "amount": 17798 }, { "year": 2019, "month": 8, "day": 9, "type": "replenishment", "amount": 10770 }, { "year": 2019, "month": 8, "day": 10, "type": "withdrawal", "amount": 7400 }, { "year": 2019, "month": 8, "day": 12, "type": "payment", "amount": 6065 }, { "year": 2019, "month": 8, "day": 14, "type": "withdrawal", "amount": 900 }, { "year": 2019, "month": 8, "day": 14, "type": "withdrawal", "amount": 1400 }, { "year": 2019, "month": 8, "day": 14, "type": "payment", "amount": 4673 }, { "year": 2019, "month": 8, "day": 15, "type": "payment", "amount": 960 }, { "year": 2019, "month": 8, "day": 15, "type": "payment", "amount": 1085 }, { "year": 2019, "month": 8, "day": 17, "type": "payment", "amount": 3723 }, { "year": 2019, "month": 8, "day": 17, "type": "payment", "amount": 2522 }, { "year": 2019, "month": 8, "day": 19, "type": "replenishment", "amount": 2496 }, { "year": 2019, "month": 8, "day": 20, "type": "payment", "amount": 876 }, { "year": 2019, "month": 8, "day": 20, "type": "payment", "amount": 2504 }, { "year": 2019, "month": 8, "day": 21, "type": "payment", "amount": 826 }, { "year": 2019, "month": 8, "day": 22, "type": "payment", "amount": 768 }, { "year": 2019, "month": 8, "day": 23, "type": "withdrawal", "amount": 700 }, { "year": 2019, "month": 8, "day": 23, "type": "payment", "amount": 190 }, { "year": 2019, "month": 8, "day": 24, "type": "payment", "amount": 235 }, { "year": 2019, "month": 9, "day": 1, "type": "replenishment", "amount": 95512 }, { "year": 2019, "month": 9, "day": 3, "type": "payment", "amount": 26758 }, { "year": 2019, "month": 9, "day": 3, "type": "replenishment", "amount": 8377 }, { "year": 2019, "month": 9, "day": 4, "type": "payment", "amount": 30865 }, { "year": 2019, "month": 9, "day": 4, "type": "withdrawal", "amount": 12800 }, { "year": 2019, "month": 9, "day": 7, "type": "payment", "amount": 10518 }, { "year": 2019, "month": 9, "day": 8, "type": "payment", "amount": 11007 }, { "year": 2019, "month": 9, "day": 10, "type": "payment", "amount": 5613 }, { "year": 2019, "month": 9, "day": 10, "type": "withdrawal", "amount": 1700 }, { "year": 2019, "month": 9, "day": 12, "type": "payment", "amount": 2237 }, { "year": 2019, "month": 9, "day": 14, "type": "payment", "amount": 885 }, { "year": 2019, "month": 9, "day": 14, "type": "payment", "amount": 977 }, { "year": 2019, "month": 9, "day": 15, "type": "payment", "amount": 766 }, { "year": 2019, "month": 9, "day": 17, "type": "payment", "amount": 360 }, { "year": 2019, "month": 9, "day": 18, "type": "payment", "amount": 116 }, { "year": 2019, "month": 9, "day": 18, "type": "withdrawal", "amount": 200 }, { "year": 2019, "month": 9, "day": 19, "type": "payment", "amount": 115 }, { "year": 2019, "month": 9, "day": 20, "type": "payment", "amount": 50 }, { "year": 2019, "month": 9, "day": 21, "type": "payment", "amount": 32 }, { "year": 2019, "month": 10, "day": 1, "type": "replenishment", "amount": 90475 }, { "year": 2019, "month": 10, "day": 1, "type": "replenishment", "amount": 8845 }, { "year": 2019, "month": 10, "day": 2, "type": "payment", "amount": 7121 }, { "year": 2019, "month": 10, "day": 3, "type": "payment", "amount": 27955 }, { "year": 2019, "month": 10, "day": 3, "type": "payment", "amount": 23079 }, { "year": 2019, "month": 10, "day": 4, "type": "payment", "amount": 5948 }, { "year": 2019, "month": 10, "day": 7, "type": "withdrawal", "amount": 4400 }, { "year": 2019, "month": 10, "day": 8, "type": "payment", "amount": 9677 }, { "year": 2019, "month": 10, "day": 9, "type": "payment", "amount": 3912 }, { "year": 2019, "month": 10, "day": 9, "type": "replenishment", "amount": 3870 }, { "year": 2019, "month": 10, "day": 9, "type": "payment", "amount": 6949 }, { "year": 2019, "month": 10, "day": 10, "type": "withdrawal", "amount": 3400 }, { "year": 2019, "month": 10, "day": 10, "type": "replenishment", "amount": 7471 }, { "year": 2019, "month": 10, "day": 10, "type": "payment", "amount": 5962 }, { "year": 2019, "month": 10, "day": 10, "type": "payment", "amount": 4990 }, { "year": 2019, "month": 10, "day": 10, "type": "withdrawal", "amount": 3000 }, { "year": 2019, "month": 10, "day": 11, "type": "withdrawal", "amount": 200 }, { "year": 2019, "month": 10, "day": 12, "type": "withdrawal", "amount": 1300 }, { "year": 2019, "month": 10, "day": 13, "type": "payment", "amount": 986 }, { "year": 2019, "month": 10, "day": 14, "type": "replenishment", "amount": 4225 }, { "year": 2019, "month": 10, "day": 15, "type": "withdrawal", "amount": 900 }, { "year": 2019, "month": 10, "day": 17, "type": "payment", "amount": 864 }, { "year": 2019, "month": 10, "day": 17, "type": "withdrawal", "amount": 1000 }, { "year": 2019, "month": 10, "day": 18, "type": "payment", "amount": 801 }, { "year": 2019, "month": 10, "day": 19, "type": "withdrawal", "amount": 300 }, { "year": 2019, "month": 10, "day": 20, "type": "payment", "amount": 530 }, { "year": 2019, "month": 11, "day": 1, "type": "replenishment", "amount": 80285 }, { "year": 2019, "month": 11, "day": 3, "type": "payment", "amount": 38155 }, { "year": 2019, "month": 11, "day": 6, "type": "payment", "amount": 10260 }, { "year": 2019, "month": 11, "day": 9, "type": "payment", "amount": 11013 }, { "year": 2019, "month": 11, "day": 10, "type": "payment", "amount": 1232 }, { "year": 2019, "month": 11, "day": 12, "type": "withdrawal", "amount": 5100 }, { "year": 2019, "month": 11, "day": 12, "type": "payment", "amount": 1192 }, { "year": 2019, "month": 11, "day": 13, "type": "withdrawal", "amount": 4500 }, { "year": 2019, "month": 11, "day": 14, "type": "replenishment", "amount": 4304 }, { "year": 2019, "month": 11, "day": 15, "type": "withdrawal", "amount": 700 }, { "year": 2019, "month": 11, "day": 15, "type": "replenishment", "amount": 15857 }, { "year": 2019, "month": 11, "day": 17, "type": "payment", "amount": 9134 }, { "year": 2019, "month": 11, "day": 19, "type": "payment", "amount": 8090 }, { "year": 2019, "month": 11, "day": 20, "type": "payment", "amount": 2117 }, { "year": 2019, "month": 11, "day": 20, "type": "withdrawal", "amount": 2700 }, { "year": 2019, "month": 11, "day": 21, "type": "withdrawal", "amount": 2200 }, { "year": 2019, "month": 11, "day": 21, "type": "payment", "amount": 258 }, { "year": 2019, "month": 11, "day": 21, "type": "withdrawal", "amount": 1200 }, { "year": 2019, "month": 11, "day": 21, "type": "payment", "amount": 1966 }, { "year": 2019, "month": 11, "day": 21, "type": "withdrawal", "amount": 200 }, { "year": 2019, "month": 11, "day": 21, "type": "payment", "amount": 493 }, { "year": 2019, "month": 11, "day": 21, "type": "payment", "amount": 396 }, { "year": 2019, "month": 11, "day": 21, "type": "withdrawal", "amount": 200 }, { "year": 2019, "month": 11, "day": 21, "type": "payment", "amount": 134 }, { "year": 2019, "month": 11, "day": 22, "type": "replenishment", "amount": 4815 }, { "year": 2019, "month": 11, "day": 22, "type": "withdrawal", "amount": 500 }, { "year": 2019, "month": 11, "day": 23, "type": "payment", "amount": 1793 }, { "year": 2019, "month": 12, "day": 1, "type": "replenishment", "amount": 93524 }, { "year": 2019, "month": 12, "day": 2, "type": "payment", "amount": 44289 }, { "year": 2019, "month": 12, "day": 2, "type": "payment", "amount": 7724 }, { "year": 2019, "month": 12, "day": 4, "type": "payment", "amount": 9420 }, { "year": 2019, "month": 12, "day": 4, "type": "withdrawal", "amount": 3200 }, { "year": 2019, "month": 12, "day": 4, "type": "payment", "amount": 651 }, { "year": 2019, "month": 12, "day": 6, "type": "payment", "amount": 9259 }, { "year": 2019, "month": 12, "day": 6, "type": "withdrawal", "amount": 5700 }, { "year": 2019, "month": 12, "day": 7, "type": "payment", "amount": 1298 }, { "year": 2019, "month": 12, "day": 9, "type": "payment", "amount": 3108 }, { "year": 2019, "month": 12, "day": 11, "type": "withdrawal", "amount": 4300 }, { "year": 2019, "month": 12, "day": 13, "type": "withdrawal", "amount": 200 }, { "year": 2019, "month": 12, "day": 13, "type": "replenishment", "amount": 9096 }, { "year": 2019, "month": 12, "day": 14, "type": "payment", "amount": 7205 }, { "year": 2019, "month": 12, "day": 16, "type": "payment", "amount": 658 }, { "year": 2019, "month": 12, "day": 17, "type": "replenishment", "amount": 9654 } ] First, for the task_1, I get an object that contains values by the key "month": var arr1 = ops.map(function(item){ return item.month }) Then I find the sum of the unique values in the resulting array: quantity var = {}; for (var i = 0; i <arr1.length; i++){ quantity [arr1[i]] = 1 + (quantity [arr1[i]]|/ 0); } and I get the counts object in the following form: counts {1: 27, 2: 11, 3: 23, 4: 20, 5: 17, 6: 21, 7: 11, 8: 24, 9: 19, 10: 26, 11: 27, 12: 16} After that, I sort to find the 3 maximum values: function findMax 3(obj){ var res = [-1,-1,-1]; for (let key in obj){ res[3] = obj[key]; res.sort(function(a,b){return b-a}); } res.pop(); return res; } console.log(findMax3(counts)); In the console I get the following: [27, 27, 26] but at the same time, I no longer know the index of the months to which these values relate Thank you for your answers!
To solve these problems here is the hint "GroupBy using reduce" As for task1 function task_1(arr) { // Dictionary of Month to Object. const groupedByMonth = arr.reduce(function (acc, currentValue) { let groupKey = currentValue.month; if (!acc[groupKey]) { acc[groupKey] = { year: currentValue.year, month: currentValue.month, opsCount: 0 }; } acc[groupKey].opsCount += 1; // ++ return acc; }, {}); // Sort by opsCount function opsSort(a, b) { return b.opsCount - a.opsCount }; return Object .values(groupedByMonth) // Array of Values .sort(opsSort) .slice(0, 3) // Top 3 } Once you understand how task 1 is solved, task 2 becomes a bit simpler Solution for Task 2 function getEndOfMonth(year, month) { const date = new Date(year, month, 0); let monthStr = ""; if (month < 10) { monthStr += "0"; } monthStr += month; return year + "-" + monthStr + "-" + date.getDate(); } function getRank(rate) { if (rate < 0.15) return 'Gold'; if (rate < 0.3) return 'Gold'; return 'Bronze'; } function task_2(arr) { const groupedByMonth = arr.reduce(function (acc, currentValue) { let groupKey = currentValue.month; if (!acc[groupKey]) { acc[groupKey] = { date: getEndOfMonth(currentValue.year, currentValue.month), monthWithrawal: 0, totalDebits: 0, totalDeposits: 0 }; } // Based on type calculate value. if (currentValue.type === "replenishment") { acc[groupKey].totalDeposits += currentValue.amount; } else if (currentValue.type === "payment") { acc[groupKey].totalDebits += currentValue.amount; } else if (currentValue.type === "withdrawal") { acc[groupKey].monthWithrawal += currentValue.amount; } return acc; }, {}); return Object .values(groupedByMonth) // Array of Values .map(function (ele) { const withdrawalRate = ele.monthWithrawal / ele.totalDeposits; return { date: ele.date, monthBalance: ele.totalDeposits - ele.totalDebits - ele.monthWithrawal, monthWithrawal: ele.monthWithrawal, withdrawalRate, rank: getRank(withdrawalRate) }; }); } if you have solved task 2, task 3 is just adding reduce/map to task2's solution. function task_3(arr) { // Assuming that task_2 function is defined. const task2 = task_2(arr); // Can be Solved using reduce. return task2 .map(function (currentValue, index, array) { const tmp = currentValue; tmp.totalBalance = tmp.monthBalance; if (index > 0) { // Not the first element. tmp.totalBalance += array[index - 1].totalBalance; } return tmp; }) }
Task 1 const task_1 = (arr, top = 3) => { const ops = arr.reduce((acc, {year, month}) => { const accByMonth = acc.find((obj) => (obj.month === month)); if (accByMonth) { accByMonth.opsCount +=1; } else { acc.push({ year, month, opsCount: 1 }) } return acc; }, []); const sortedOps = ops.sort( (obj1, obj2) => (obj2.opsCount - obj1.opsCount) ); return sortedOps.slice(0, top); } console.log(task_1(data)); //[ // { year: 2019, month: 1, opsCount: 27 }, // { year: 2019, month: 11, opsCount: 27 }, // { year: 2019, month: 10, opsCount: 26 } //] Task 2 const getTotalByType = (arr, type) => arr .filter((obj) => obj.type === type) .reduce((sum, { amount }) => sum + amount, 0); const getRank = (ratio) =>{ const ranks = [[0.15, 'Gold'], [0.3, 'Silver'], [Infinity, 'Bronze']] return ranks.find(([ rankRatio ]) => ratio < rankRatio)[1]; } const task_2 = (year, month, arr) => { const filteredData = arr.filter((obj) => (obj.year === year) && (obj.month === month)); const maxDay = Math.max(...filteredData.map(({ day }) => day)); const date = new Date(year, month - 1, maxDay).toISOString().split('T')[0]; const monthReplenishment = getTotalByType(filteredData, 'replenishment'); const monthPayment = getTotalByType(filteredData, 'payment'); const monthWithdrawal = getTotalByType(filteredData, 'withdrawal'); const monthBalance = monthReplenishment - monthPayment - monthWithdrawal; const withdrawalRate = parseFloat((monthWithdrawal / monthReplenishment).toFixed(4)); const rank = getRank(withdrawalRate); return { date, monthBalance, monthWithdrawal, withdrawalRate, rank, } }; console.log(task_2(2019, 7, data)); //{ // date: '2019-07-13', // monthBalance: -2244, // monthWithdrawal: 2100, // withdrawalRate: 0.0406, // rank: 'Gold' //} Task 3 const getPeriods = (arr) => arr. reduce((acc, {year, month}) => { const isPeriodInAcc = acc.some( (obj) => (obj.month === month) && (obj.year === year) ); if (!isPeriodInAcc) { acc.push({ year, month }) } return acc; }, []) const task_3 = (arr, initialBalance = 0) => { const periods = getPeriods(arr); let totalBalance = initialBalance; return periods.map(({ year, month }) => { const opsByPeriod = task_2(year, month, arr); totalBalance += opsByPeriod.monthBalance; return {...opsByPeriod, totalBalance} }); } console.log(task_3(data)); //[ // { // date: '2019-01-22', // monthBalance: 3829, // monthWithdrawal: 33800, // withdrawalRate: 0.3134, // rank: 'Bronze', // totalBalance: 3829 // }, // ... // {...}, //]
How to eliminate multiple iteration
Following code gets the result below in a way that multiple iterations required. I wonder what would be the way to make it happen in a single or less iterations. Thanks in advance. var input = [{ "ActiveMembers": [{ "Id": 101, "Name": "alpha" }, { "Id": 102, "Name": "bravo" }], "Contents": [{ "Id": 2001, "RowId": "517", "Time": "19 Jan 2017", "ViewCount": 1124 }, { "Id": 2002, "RowId": "518", "Time": "Today, 07:02 PM", "ViewCount": 62 }], "TotalUsers": 3, "UsersDetails": "2 members, 1 anonymous users" }, { "ActiveMembers": [{ "Id": 101, "Name": "alpha" }, { "Id": 103, "Name": "charlie" }, { "Id": 104, "Name": "delta" }, { "Id": 105, "Name": "bravo" }], "Contents": [{ "Id": 2002, "RowId": "519", "Time": "27 Jun 2017", "ViewCount": 4833 }, { "Id": 2041, "RowId": "525", "Time": "17 Feb 2015", "ViewCount": 24491 }], "TotalUsers": 23, "UsersDetails": "4 members, 19 anonymous users" }]; var contents = Array.prototype.concat.apply([], input.map(i => i.Contents)); var activeMembers = _.uniqBy(Array.prototype.concat.apply([], input.map(i => i.ActiveMembers)), (i) => i.Id); var totalUsers = number = _.sumBy(input, (i) => i.TotalUsers); var userDetails = string = input.map(i => i.UsersDetails).join(' ; '); const result = new Object(); result.Contents = contents; result.ActiveMembers = activeMembers; result.TotalUsers = totalUsers; result.UserDetails = userDetails; console.log(JSON.stringify(result)); <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script> Result { "ActiveMembers": [ { "Id": 101, "Name": "alpha" }, { "Id": 102, "Name": "bravo" }, { "Id": 103, "Name": "charlie" }, { "Id": 104, "Name": "delta" }, { "Id": 105, "Name": "bravo" } ], "Contents": [ { "Id": 2001, "RowId": "517", "Time": "19 Jan 2017", "ViewCount": 1124 }, { "Id": 2002, "RowId": "518", "Time": "Today, 07:02 PM", "ViewCount": 62 }, { "Id": 2002, "RowId": "519", "Time": "27 Jun 2017", "ViewCount": 4833 }, { "Id": 2041, "RowId": "525", "Time": "17 Feb 2015", "ViewCount": 24491 } ], "TotalUsers": 26, "UsersDetails": "2 members, 1 anonymous users;4 members, 19 anonymous users" }
Aggregate the data in a single iteration. let ActiveMembers = []; let Contents = []; let TotalUsers = 0; let UserDetails = []; input.forEach((item) => { ActiveMembers = ActiveMembers.concat(item.ActiveMembers); Contents = Contents.concat(item.Contents); TotalUsers += item.TotalUsers; UserDetails.push(item.UsersDetails); }); const result = { ActiveMembers: _.uniqBy(ActiveMembers, "Id"), Contents: Contents, TotalUsers: TotalUsers, UserDetails: UserDetails.join(";") }; console.log(JSON.stringify(result));
Highcharts rendering line chart in single line
I was using highchart library in my application to visualize my data. I have render Line chart, while first time it's rendering properly. But when I modify dateRange, I am passing updated data to line chart function. But highcharts rendering line chart in single line. These are the my chart options { "credits": { "enabled": false }, "colors": [ "#3093d1", "#fcb631", "#9ad631", "#f34ea8", "#30bfdd", "#fc9532", "#9f4bc7", "#304ec6", "#fcd731", "#f08576", "#418842" ], "chart": { "plotBackgroundColor": null, "plotBorderWidth": null, "plotShadow": false, "renderTo": { "sizzle1448613814074": { "parentNode": [ 190, 49, true ] } }, "subtitle": { "text": null }, "tooltip": { "shared": true, "useHTML": false }, "type": "line" }, "title": { "text": null }, "xAxis": { "type": "datetime", "title": { "text": null }, "labels": {}, "categories": [ "Oct 28, 2015", "Oct 29, 2015", "Oct 30, 2015", "Oct 31, 2015", "Nov 01, 2015", "Nov 02, 2015", "Nov 03, 2015", "Nov 04, 2015", "Nov 05, 2015", "Nov 06, 2015", "Nov 07, 2015", "Nov 08, 2015", "Nov 09, 2015", "Nov 10, 2015", "Nov 11, 2015", "Nov 12, 2015", "Nov 13, 2015", "Nov 14, 2015", "Nov 15, 2015", "Nov 16, 2015", "Nov 17, 2015", "Nov 18, 2015", "Nov 19, 2015", "Nov 20, 2015", "Nov 21, 2015", "Nov 22, 2015", "Nov 23, 2015", "Nov 24, 2015", "Nov 25, 2015", "Nov 26, 2015" ], "crosshair": true, "tickInterval": 4 }, "yAxis": [ { "labels": { "align": "left", "x": 0, "y": -2 }, "title": { "text": " " }, "opposite": false, "showEmpty": true } ], "plotOptions": { "column": { "pointPadding": 0, "borderWidth": 0 }, "pie": { "allowPointSelect": true, "cursor": "pointer", "dataLabels": { "enabled": false } }, "series": { "stacking": "percent" } }, "legend": { "itemStyle": { "font": "9pt Trebuchet MS, Verdana, sans-serif", "color": "black", "fontWeight": "normal", "width": 416 }, "itemHoverStyle": { "color": "gray" }, "title": "", "verticalAlign": "top", "borderWidth": 0, "enabled": true, "adjustChartSize": true }, "series": [ { "name": "shipped_rgm", "data": [ 14762955.1, 19276099.9, 12988884.9, 30569084.8, 24242187.9, 18379418.8, 18603495.8, 18203458.6, 20938703.3, 16597939.7, 20862991.3, 24023412.9, 17353371.1, 17630687.3, 13725495, 10981690.9, 11772224.6, 15237980.2, 15214048.4, 12756909.5, 13679996.9, 14433383.5, 18330217.9, 13240009.3, 14947562.6, 17269289.7, 14668529, 15845494.4, 15551554.6, 2482537.9 ], "yAxis": 0 } ], "navigation": { "buttonOptions": { "verticalAlign": "top", "y": 0, "enabled": false } }, "exporting": { "enabled": false }, "tooltip": { "headerFormat": "<span style=\"font-size:10px\">{point.key}</span><table>", "pointFormat": "<tr><td style=\"color:{series.color};padding:0\">{series.name}: </td><td style=\"padding:0\"><b>{point.y:,.0f}</b></td></tr>", "footerFormat": "</table>", "shared": true, "useHTML": true } } can anyone help me.
You need to comment series.stacking:percentage in plotOptions "series": { "stacking": "percent" //comment it } see the working fiddle of your code
JSON iterating through objects and accessing data result to cannot read property of undefined
I'm parsing a json from a website and trying to get some data from it. However, it is giving me undefined values when iterating through a collection of objects. If it's a badly formatted json, unfortunately, I can't change it. [ { "startYear": 2014, "startMonth": 6, "startDay": 31, "endYear": 2014, "endMonth": 7, "endDay": 29, "selectedDate": "2014_7_8", "departureStation": "Manila", "arrivalStation": "Boracay (Caticlan)", "departureStationCode": "(MNL)", "arrivalStationCode": "(MPH)", "departureLabel": "DEPARTURE", "arrivalLabel": "RETURN", "dateMarketHash": { "date_0_2014_6_31": { "containerId": "date_0_2014_6_31", "fromLabel": "From", "currency": "PHP", "price": null, "formattedDate": "Thu, Jul 31, 2014", "year": "2014", "month": "6", "day": "31", "points": null, "pointsSuffix": "", "pointsLabelAppend": "" }, "date_0_2014_7_1": { "containerId": "date_0_2014_7_1", "fromLabel": "From", "currency": "PHP", "price": 1929, "formattedDate": "Fri, Aug 01, 2014", "year": "2014", "month": "7", "day": "1", "points": 0, "pointsSuffix": "", "pointsLabelAppend": "" } } }, { "startYear": 2014, "startMonth": 7, "startDay": 24, "endYear": 2014, "endMonth": 8, "endDay": 23, "selectedDate": "2014_8_8", "departureStation": "Boracay (Caticlan)", "arrivalStation": "Manila", "departureStationCode": "(MPH)", "arrivalStationCode": "(MNL)", "departureLabel": "DEPARTURE", "arrivalLabel": "RETURN", "dateMarketHash": { "date_1_2014_7_24": { "containerId": "date_1_2014_7_24", "fromLabel": "From", "currency": "PHP", "price": 3079, "formattedDate": "Sun, Aug 24, 2014", "year": "2014", "month": "7", "day": "24", "points": 0, "pointsSuffix": "", "pointsLabelAppend": "" }, "date_1_2014_7_25": { "containerId": "date_1_2014_7_25", "fromLabel": "From", "currency": "PHP", "price": 3079, "formattedDate": "Mon, Aug 25, 2014", "year": "2014", "month": "7", "day": "25", "points": 0, "pointsSuffix": "", "pointsLabelAppend": "" } } } ] my code: // Printing the value of 'day' from each 'dateMarketHash' for (i = 0; i<json.length; i++) { var current = json[i].dateMarketHash; for(var key in current){ if (current.hasOwnProperty(key)) { document.write(current.key.day); // Cannot read property 'day' of undefined } } }
No, it is the fact that you are reading "key" and not the variable. You need to use bracket notation, not dot notation. document.write(current[key].day); And you should not be using document.write.