I just want to return an array containing the first and second objects based on the “point” property of an object
and I have a condition below, When the condition is satisfied it will swap places.
JavaScript
x
20
20
1
Default:
2
3
ENGLISH[0]
4
ENGLISH[1]
5
MATH[0]
6
MATH[1]
7
HISTORY[0]
8
HISTORY[1]
9
10
11
if(ENGLISH[0].POINT/ENGLISH[1].POINT > MATH[0].POINT/MATH[1].POINT)
12
13
MATH[0]
14
MATH[1]
15
ENGLISH[0]
16
ENGLISH[1]
17
HISTORY[0]
18
HISTORY[1]
19
20
Given the following object:
JavaScript
1
13
13
1
const arr = [
2
{ name: "John", age: 32, group: "Math", point: 70 },
3
{ name: "David", age: 23, group: "Math", point: 20 },
4
{ name: "Justin", age: 28, group: "Math", point: 20 },
5
{ name: "Neymar", age: 30, group: "Math", point: 50 },
6
{ name: "Arnauld", age: 35, group: "History", point: 40 },
7
{ name: "Ivan", age: 18, group: "History", point: 50 },
8
{ name: "Nekko", age: 13, group: "History", point: 80 },
9
{ name: "Lena", age: 25, group: "English", point: 90 },
10
{ name: "Test", age: 45, group: "English", point: 30 },
11
{ name: "Ann", age: 19, group: "English", point: 38 }
12
]
13
the result I want is
JavaScript
1
13
13
1
const result = [
2
{ name: "Lena", age: 25, group: "English", point: 90 },
3
{ name: "Test", age: 45, group: "English", point: 30 },
4
{ name: "John", age: 32, group: "Math", point: 70 },
5
{ name: "David", age: 23, group: "Math", point: 20 },
6
{ name: "Arnauld", age: 35, group: "History", point: 40 },
7
{ name: "Ivan", age: 18, group: "History", point: 50 },
8
{ name: "Ann", age: 19, group: "English", point: 38 },
9
{ name: "Justin", age: 28, group: "Math", point: 20 },
10
{ name: "Neymar", age: 30, group: "Math", point: 50 },
11
{ name: "Nekko", age: 13, group: "History", point: 80 }
12
]
13
Advertisement
Answer
You could group the data with an object for the indices and an array of references.
JavaScript
1
18
18
1
const
2
order = { English: 0, Math: 1, History: 2 },
3
data = [{ name: "John", age: 32, group: "Math", point: 70 }, { name: "David", age: 23, group: "Math", point: 20 }, { name: "Justin", age: 28, group: "Math", point: 20 }, { name: "Neymar", age: 30, group: "Math", point: 50 }, { name: "Arnauld", age: 35, group: "History", point: 40 }, { name: "Ivan", age: 18, group: "History", point: 50 }, { name: "Nekko", age: 13, group: "History", point: 80 }, { name: "Lena", age: 25, group: "English", point: 90 }, { name: "Test", age: 45, group: "English", point: 30 }, { name: "Ann", age: 19, group: "English", point: 38 }],
4
references = [0, 0, 0],
5
result = data
6
.reduce((r, o) => {
7
const i = order[o.group];
8
if (r[references[i]][i].length === 2) {
9
references[i]++;
10
r[references[i]] ??= []
11
r[references[i]][i] = [];
12
}
13
r[references[i]][i].push(o);
14
return r;
15
}, [[[], [], []]])
16
.flat(Infinity);
17
18
console.log(result);
JavaScript
1
1
1
.as-console-wrapper { max-height: 100% !important; top: 0; }