I have an array of objects returned from database. Goal is to calculate the percentage of marks for each id. For some objects marks are stored in array whereas for some it is just a normal variable.
JavaScript
x
36
36
1
const data=[
2
{
3
"Id": 1,
4
"marks": [40.25],
5
},
6
{
7
"Id": 7,
8
"marks": [70,80],
9
},
10
{
11
"Id": 2,
12
"marks": 60,
13
},
14
{
15
"Id":5,
16
"marks": [],
17
}
18
]
19
let res=[]
20
for(var i=0;i<data.length;i++)
21
{
22
let rbp=[]
23
dbp=data[i].marks
24
for(var j=0;j<dbp.length;j++)
25
{
26
const tmp=(parseFloat(dbp[j])/80)*(90/100)
27
rbp.push(tmp)
28
}
29
console.log(rbp)
30
res.push({
31
iD:data[i].Id,
32
PERCENTAGE:rbp
33
})
34
}
35
console.log(res)
36
the above code generates the following output
JavaScript
1
5
1
[ { iD: 1, PERCENTAGE: [ 0.45281250000000006 ] },
2
{ iD: 7, PERCENTAGE: [ 0.7875, 0.9 ] },
3
{ iD: 2, PERCENTAGE: [] },
4
{ iD: 5, PERCENTAGE: [] } ]
5
Percentage of marks for the penultimate object just returns an empty array. I tried getting the typeof marks but it returns object for both array and non array. How do I fix this?
Advertisement
Answer
You can standardised the marks
to array by checking if marks
is array using Array.isArray()
and convert number to array. Then you can use your existing logic.
JavaScript
1
31
31
1
const data = [{
2
"Id": 1,
3
"marks": [40.25],
4
},
5
{
6
"Id": 7,
7
"marks": [70, 80],
8
},
9
{
10
"Id": 2,
11
"marks": 60,
12
},
13
{
14
"Id": 5,
15
"marks": [],
16
}
17
]
18
let res = [];
19
for (var i = 0; i < data.length; i++) {
20
let rbp = [];
21
const dbp = Array.isArray(data[i].marks) ? data[i].marks: [data[i].marks];
22
for (var j = 0; j < dbp.length; j++) {
23
const tmp = (dbp[j] / 80) * (90 / 100);
24
rbp.push(tmp);
25
}
26
res.push({
27
ID: data[i].Id,
28
PERCENTAGE: rbp
29
})
30
}
31
console.log(res)
You can also use functional style to accomplish it.
JavaScript
1
7
1
const data=[ { "Id": 1, "marks": [40.25], }, { "Id": 7, "marks": [70,80], }, { "Id": 2, "marks": 60, }, { "Id":5, "marks": [], } ],
2
result = data.map(o => {
3
const marks = Array.isArray(o.marks) ? o.marks: [o.marks];
4
const percentage = marks.map((mark) => (mark/80) * (90/100));
5
return { ID: o.id, PERCENTAGE: percentage };
6
});
7
console.log(result);