javascript - 使用 JSON 数组查找用户的最佳时间

标签 javascript arrays json sorting

我试图从 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/

相关文章:

c++ - 哪种 C++ 数据结构可以像 Java ArrayList 一样处理 'insert'?

c - 使用数组作为函数参数

更改 C 中某些数组值的符号

json - 使用 jq 处理巨大的 json 数组文件

javascript - 使用 d3.json 事件处理程序时如何正确控制上下文

JavaScript 内联事件或事后添加事件

javascript - 为什么 jquery 选择器从旧值而不是新值中选择元素

c# - Json 从实体返回额外的值

javascript - 我在解析 JSON 时遇到错误

javascript - 使用不同函数时数据表中出现奇怪的类名问题