对有特殊条件的数组进行排序



我只是想返回一个数组,其中包含基于"point"对象的属性

和我下面有一个条件,当条件满足时,它将交换位置。

Default:
ENGLISH[0]
ENGLISH[1]
MATH[0]
MATH[1]
HISTORY[0]
HISTORY[1]
...
if(ENGLISH[0].POINT/ENGLISH[1].POINT > MATH[0].POINT/MATH[1].POINT)
MATH[0]
MATH[1]    
ENGLISH[0]
ENGLISH[1]
HISTORY[0]
HISTORY[1]
...

给定以下对象:

const arr = [
{ 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 }
]

我想要的结果是

const result = [
{ name: "Lena", age: 25, group: "English", point: 90 },
{ name: "Test", age: 45, group: "English", point: 30 },
{ name: "John", age: 32, group: "Math", point: 70 },
{ name: "David", age: 23, group: "Math", point: 20 },
{ name: "Arnauld", age: 35, group: "History", point: 40 },
{ name: "Ivan", age: 18, group: "History", point: 50 },
{ name: "Ann", age: 19, group: "English", point: 38 },
{ name: "Justin", age: 28, group: "Math", point: 20 },
{ name: "Neymar", age: 30, group: "Math", point: 50 },
{ name: "Nekko", age: 13, group: "History", point: 80 }
]

您可以使用索引对象和引用数组对数据进行分组。

const
order = { English: 0, Math: 1, History: 2 },
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 }],
references = [0, 0, 0],
result = data
.reduce((r, o) => {
const i = order[o.group];
if (r[references[i]][i].length === 2) {
references[i]++;
r[references[i]] ??= []
r[references[i]][i] = [];
}
r[references[i]][i].push(o);
return r;
}, [[[], [], []]])
.flat(Infinity);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

In case reactjs运行时环境已经过测试

import sortBy from 'lodash/sortBy';
let testData = [
{ name: 'Lena', age: 25, group: 'English', point: 90 },
{ name: 'Test', age: 45, group: 'English', point: 30 },
{ name: 'John', age: 32, group: 'Math', point: 70 },
{ name: 'David', age: 23, group: 'Math', point: 20 },
{ name: 'Arnauld', age: 35, group: 'History', point: 40 },
{ name: 'Ivan', age: 18, group: 'History', point: 50 },
{ name: 'Ann', age: 19, group: 'English', point: 38 },
{ name: 'Justin', age: 28, group: 'Math', point: 20 },
{ name: 'Neymar', age: 30, group: 'Math', point: 50 },
{ name: 'Nekko', age: 13, group: 'History', point: 80 }
];
let sortedDataByName = sortBy(result, 'name');
let sortedDataByAge = sortBy(result, 'age');
let sortedDataByGroup = sortBy(result, 'group');
let sortedDataByPoints = sortBy(result, 'point');

最新更新