javascript - 如何比较数组中的每个元素并将具有相同数据的元素分组(在我的情况下为日期)?JavaScript
问题描述
const patientDetails = [
{patientName: "A", dateReg: "2019-11-12", room: "room1", user: "k" },
{patientName: "B", dateReg: "2019-11-12", room: "room8", user: "k" },
{patientName: "C", dateReg: "2019-11-12", room: "room2", user: "k" },
{patientName: "D", dateReg: "2019-11-12", room: "room5", user: "k" },
{patientName: "E", dateReg: "2019-11-12", room: "room6", user: "k" },
{patientName: "F", dateReg: "2019-11-11", room: "room10", user: "k" },
{patientName: "G", dateReg: "2019-11-11", room: "room18", user: "k" }
]
我有一个包含患者详细信息的数组。我想要做的是,如果患者的 dateReg 相同,那么我想基本上将它们分组。在 UI 中,我想先渲染一行日期(2019-11-12),然后接下来的行将填充具有相同日期(2019-11-12)的患者详细信息,直到有另一个患者日期不同(2019-11-11)。如果有不同的日期,我想用新日期 (2019-11-11) 添加一个新行,然后将具有这些日期 (2019-11-11) 的患者详细信息呈现到不同的日期,依此类推。 ..
我无法让它发挥作用,也不完全确定我的方向是否正确。
我试过了
const dateCheck = patientDetails[0].dateReg;
date.map(patient => {
if(patient.dateReg === dateCheck){
return (
<tr>
<td>{patient.dateReg}</td>
</tr>
<tr>
<td>{paitent.patientName} </td>
<td>{patient.room}</td>
<td>{patient.user}</td>
<tr>
)
}else {
return(
<tr>
<td>{patient.dateReg}</td>
</tr>
<tr>
<td>{paitent.patientName} </td>
<td>{patient.room}</td>
<td>{patient.user}</td>
<tr>
)
}
})
解决方案
对数组数据进行分组的基本方法是使用array.prototype.reduce
. 您可以使用array.prototype.sort
. 这是没有 UI 的本质:
const patientDetails = [
{patientName: "A", dateReg: "2019-11-12", room: "room1", user: "k" },
{patientName: "B", dateReg: "2019-11-12", room: "room8", user: "k" },
{patientName: "C", dateReg: "2019-11-12", room: "room2", user: "k" },
{patientName: "D", dateReg: "2019-11-12", room: "room5", user: "k" },
{patientName: "E", dateReg: "2019-11-12", room: "room6", user: "k" },
{patientName: "F", dateReg: "2019-11-11", room: "room10", user: "k" },
{patientName: "G", dateReg: "2019-11-11", room: "room18", user: "k" }
];
let grouped = patientDetails.reduce((g, d) => {
g[d.dateReg] = g[d.dateReg] || [];
g[d.dateReg].push(d);
return g;
}, {});
let sorted = Object.values(grouped).sort(([a], [b]) => a.dateReg > b.dateReg);
sorted.forEach(s => {
console.log(`===${s[0].dateReg}===`);
s.forEach(ss => console.log(`${ss.patientName} ${ss.room} ${ss.user}`));
console.log();
});
推荐阅读
- c# - 使用 EF 和 SQLite 的 AddOrUpdate 语法
- server - 在服务器上安全地运行用户提供的纯函数
- java - Google Play 付款会在 72 小时后退还
- android - android 模拟器 (macOS) 上未连接网络
- java - 将带有“SHA512CryptoServiceProvider”的 C# 代码转换为 Java
- c - 数组存储在内存中的什么位置?
- java - 如何从 OPTIONS 中禁用或删除允许响应标头?
- php - (isset($_SERVER['HTTPS']) 我的脚本的当前目录
- java - 如何在不使用 replace() 方法的情况下从字符串中删除子字符串?
- python - 如何从元组列表中对元组索引 n 处的所有值求和?