javascript - 使用 JSON 数组从用户那里找到最佳时间
问题描述
我试图从 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} 等]
现在我正在尝试获取每个用户的所有值的总和,我想出了如何从 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);
}));
解决方案
首先迭代results
并将每个user#
属性值组合到该用户的数组中。然后你可以对其进行排序,创建一个对象映射user#
s 到名称,并在排序后的数组中取第一个值来得到你想要的:
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));
推荐阅读
- reactjs - 创建一个 SearchBar,在用户提交搜索后,显示该标题的所有匹配项(或部分匹配项)
- r - 按小时分钟从最早到最晚的升序排列我的df
- html - 我希望菜单在最小化到移动屏幕后变成汉堡包图标
- python - 二叉搜索树顺序不起作用(python)
- node.js - socket.io:监听事件
- python - 如何使用 SQL 将文字表合并到雪花中的现有表中
- c# - 无法从字符串转换为 NewtonSoft.Json.JsonReader
- c++ - 什么时候在 lambda 函数中释放变量副本?
- android - 标签栏视图问题
- json - 如何知道一个值是否是json中某个键的值?循环遍历所有键并进行比较