Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

  1. 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 }
]
  1. 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’
}
  1. 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!

like image 593
JohnSmith Avatar asked Oct 27 '21 03:10

JohnSmith


People also ask

How can I get specific data from JSON?

Getting a specific property from a JSON response object Instead, you select the exact property you want and pull that out through dot notation. The dot ( . ) after response (the name of the JSON payload, as defined arbitrarily in the jQuery AJAX function) is how you access the values you want from the JSON object.

How to select selected text from a JSON array in JavaScript?

I’ll first create a JSON array inside a JavaScript function and add few data to it. Next, I’ll iterate (loop) through each value in the array and bind the values to the SELECT element. See how I got the selected text of the SELECT element in the above example.

How can I select a particular JSON object based on criteria?

The straight forward way is to loop through the JSON objects and select the particular object based upon the criteria. So what I thought of is that can I make a reusable code so that it can help others in selecting a particular JSON object based upon a certain criteria.

How to select a particular JSON object in client side?

Often while working with the web services that return JSON objects to the client side I find a need to select some particular JSON objects in the client side based upon certain criteria. The straight forward way is to loop through the JSON objects and select the particular object based upon the criteria.

How to select key/properties from JSON object using SQL JavaScript function?

In the above highlighted code snippet we are passing the JSON object, containing the criteria for selection of JSON objects, to pass to the sql javascript function. select: Mention the keys/properties you want to select out of the JSON object. from: Mention the JSON object from which the selection will be made.


Video Answer


2 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;
        })
}
like image 146
Navonil Das Avatar answered Oct 24 '22 05:10

Navonil Das


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
//  },
//  ...
//  {...},
//]
like image 24
Alexandr Belan Avatar answered Oct 24 '22 05:10

Alexandr Belan