首页 > 解决方案 > 使用 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);


}));

标签: javascriptarraysjsonsorting

解决方案


首先迭代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));


推荐阅读