我试图从 JSON 中找到每个用户的最佳结果。
const users = [
{
"key": "user1",
"label": "Henry"
},
{
"key": "user2",
"label": "Michael"
},
{
"key": "user3",
"label": "Fiddel"
},
{
"key": "user4",
"label": "Alex"
},
{
"key": "user5",
"label": "Mark"
}
]
const results = [
{
"user1": "00:31.241",
"user2": "00:30.945",
"user3": "00:33.065",
"user4": null,
"user5": null
},
{
"user1": "00:28.963",
"user2": "00:31.657",
"user3": "00:28.504",
"user4": null,
"user5": null
},
{
"user1": "00:26.956",
"user2": "00:26.416",
"user3": "00:27.328",
"user4": "00:29.904",
"user5": null
},
{
"user1": "00:31.889",
"user2": "00:32.739",
"user3": "01:00.515",
"user4": "00:28.336",
"user5": "00:35.745"
},
{
"user1": "00:26.470",
"user2": "00:30.063",
"user3": "00:28.696",
"user4": "00:30.248",
"user5": "00:35.123"
},
{
"user1": "00:26.956",
"user2": "00:33.588",
"user3": "00:30.021",
"user4": "00:29.154",
"user5": "00:38.492"
},
{
"user1": "00:27.190",
"user2": "00:32.307",
"user3": "00:30.467",
"user4": "00:30.189",
"user5": "00:39.669"
},
{
"user1": "00:27.368",
"user2": "00:28.124",
"user3": "00:29.960",
"user4": "00:29.649",
"user5": "00:42.450"
},
{
"user1": "00:28.429",
"user2": "00:27.651",
"user3": "00:28.260",
"user4": "00:30.077",
"user5": "00:48.992"
},
{
"user1": "00:29.425",
"user2": "00:31.142",
"user3": "00:40.343",
"user4": "00:29.897",
"user5": "00:42.552"
}
]
到目前为止,我已经想出了以下解决方案:
let array = [];
const bestTime = results.map(Object.entries).flat().sort((a, b) => a[1] ?.localeCompare(b[1]))[0];
array = [users.filter(user => user.key === test[0])[0].label, test[1]]
问题是我不知道如何为每个用户打印出一个具有最佳结果的数组,而不仅仅是一个。 我想要这样的输出: [{name: 'Henry', value: 00:35.233}, {name: 'Michael', value: 00.27.333}, etc]
现在我正在尝试获取每个用户的所有值的总和,我弄清楚了如何从 JSON 中过滤掉空值以及如何获取所有值的总和。问题是结果是字符串值,我无法弄清楚如何正确解析该数据以获得总和。
const final = users.map(({ label, key }) => ({
name: label,
value: results.map(r => r[key]).filter(el => el != null).reduce((prev, curr) => parseInt(prev) + parseInt(prev);
}));
最佳答案
首先迭代结果
,并将每个user#
属性值组合到该用户的数组中。然后您可以对其进行排序,创建一个将 user#
映射到名称的对象,并获取排序数组中的第一个值以获得您想要的内容:
const users=[{key:"user1",label:"Henry"},{key:"user2",label:"Michael"},{key:"user3",label:"Fiddel"},{key:"user4",label:"Alex"},{key:"user5",label:"Inga"}],results=[{user1:"00:31.241",user2:"00:30.945",user3:"00:33.065",user4:null,user5:null},{user1:"00:28.963",user2:"00:31.657",user3:"00:28.504",user4:null,user5:null},{user1:"00:26.956",user2:"00:26.416",user3:"00:27.328",user4:"00:29.904",user5:null},{user1:"00:31.889",user2:"00:32.739",user3:"01:00.515",user4:"00:28.336",user5:"00:35.745"},{user1:"00:26.470",user2:"00:30.063",user3:"00:28.696",user4:"00:30.248",user5:"00:35.123"},{user1:"00:26.956",user2:"00:33.588",user3:"00:30.021",user4:"00:29.154",user5:"00:38.492"},{user1:"00:27.190",user2:"00:32.307",user3:"00:30.467",user4:"00:30.189",user5:"00:39.669"},{user1:"00:27.368",user2:"00:28.124",user3:"00:29.960",user4:"00:29.649",user5:"00:42.450"},{user1:"00:28.429",user2:"00:27.651",user3:"00:28.260",user4:"00:30.077",user5:"00:48.992"},{user1:"00:29.425",user2:"00:31.142",user3:"00:40.343",user4:"00:29.897",user5:"00:42.552"}];
const timesByUserNumber = {};
for (const result of results) {
for (const [userNumber, time] of Object.entries(result)) {
if (!timesByUserNumber[userNumber]) {
timesByUserNumber[userNumber] = [];
}
if (time) {
// Exclude nulls:
timesByUserNumber[userNumber].push(time);
}
}
}
for (const arr of Object.values(timesByUserNumber)) {
arr.sort((a, b) => a.localeCompare(b));
}
const userLabelsByUserNumber = Object.fromEntries(
users.map(({ key, label }) => [key, label])
);
const output = Object.entries(timesByUserNumber)
.map(([userNumber, timeArr]) => ({
name: userLabelsByUserNumber[userNumber],
value: timeArr[0]
}));
console.log(output);
您还可以通过在迭代时单独比较每个项目来“排序”:
const users=[{key:"user1",label:"Henry"},{key:"user2",label:"Michael"},{key:"user3",label:"Fiddel"},{key:"user4",label:"Alex"},{key:"user5",label:"Inga"}],results=[{user1:"00:31.241",user2:"00:30.945",user3:"00:33.065",user4:null,user5:null},{user1:"00:28.963",user2:"00:31.657",user3:"00:28.504",user4:null,user5:null},{user1:"00:26.956",user2:"00:26.416",user3:"00:27.328",user4:"00:29.904",user5:null},{user1:"00:31.889",user2:"00:32.739",user3:"01:00.515",user4:"00:28.336",user5:"00:35.745"},{user1:"00:26.470",user2:"00:30.063",user3:"00:28.696",user4:"00:30.248",user5:"00:35.123"},{user1:"00:26.956",user2:"00:33.588",user3:"00:30.021",user4:"00:29.154",user5:"00:38.492"},{user1:"00:27.190",user2:"00:32.307",user3:"00:30.467",user4:"00:30.189",user5:"00:39.669"},{user1:"00:27.368",user2:"00:28.124",user3:"00:29.960",user4:"00:29.649",user5:"00:42.450"},{user1:"00:28.429",user2:"00:27.651",user3:"00:28.260",user4:"00:30.077",user5:"00:48.992"},{user1:"00:29.425",user2:"00:31.142",user3:"00:40.343",user4:"00:29.897",user5:"00:42.552"}];
const userLabelsByUserNumber = Object.fromEntries(
users.map(({ key, label }) => [key, label])
);
const grouped = {};
for (const result of results) {
for (const [userNumber, time] of Object.entries(result)) {
if (!time) continue;
const name = userLabelsByUserNumber[userNumber];
if (!grouped[name]) {
grouped[name] = { name, value: time };
} else if (grouped[name].value.localeCompare(time) > 0) {
grouped[name].value = time;
}
}
}
console.log(Object.values(grouped));
关于javascript - 使用 JSON 数组查找用户的最佳时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64415123/