javascript - 动态重组一个对象数组,每个对象包含两个属性值对
问题描述
我正在从数据库中提取数据并最终得到一组对象,每个对象都包含服务员姓名和他们工作的日子。我想通过将数组压缩为每个服务员具有两个属性值对的单个对象来动态重组数组。名称的一个属性和工作天数的另一个属性。
我真的很想看到你的反馈。我首先提取名称并删除重复项。给我留下这样的数组:let waiterNames = ['John','Mark','Jess'].
然后我尝试了一个 double for of 循环并以某种方式创建了一个新的对象数组,但我被卡住了。
for (entry in waiterInfo) {
for (waiter in waiterNames) {
if (entry.waiters == waiter) {
???
}
}
}
waiterInfo
是我开始的,newInfo
是我想要达到的。我需要动态发生这种情况,因为从数据库中提取的数据是不可预测的。
let waiterInfo = [{ waiters: 'John', weekdays: 'Monday' },
{ waiters: 'John', weekdays: 'Tuesday' },
{ waiters: 'John', weekdays: 'Wednesday' },
{ waiters: 'Mark', weekdays: 'Monday' },
{ waiters: 'Mark', weekdays: 'Tuesday' },
{ waiters: 'Jess', weekdays: 'Monday' },
{ waiters: 'Jess', weekdays: 'Tuesday' },
{ waiters: 'Jess', weekdays: 'Wednesday' },
{ waiters: 'Jess', weekdays: 'Thursday' }]
let newInfo = [{ waiters: 'John', weekdays: 'Monday, Tuesday, Wednesday'},
{ waiters: 'Mark', weekdays: 'Monday, Tuesday' },
{ waiters: 'Jess', weekdays: 'Monday, Tuesday, Wednesday, Thursday' }]
解决方案
您可以在旁边使用地图reduce
:
let waiterInfo = [{ waiters: 'John', weekdays: 'Monday' },
{ waiters: 'John', weekdays: 'Tuesday' },
{ waiters: 'John', weekdays: 'Wednesday' },
{ waiters: 'Mark', weekdays: 'Monday' },
{ waiters: 'Mark', weekdays: 'Tuesday' },
{ waiters: 'Jess', weekdays: 'Monday' },
{ waiters: 'Jess', weekdays: 'Tuesday' },
{ waiters: 'Jess', weekdays: 'Wednesday' },
{ waiters: 'Jess', weekdays: 'Thursday' }
]
const map = new Map()
const newInfo = waiterInfo.reduce((a, o) => {
const i = map.get(o.waiters)
if(i !== undefined) {
a[i].weekdays = [a[i].weekdays, o.weekdays].join(', ')
} else {
map.set(o.waiters, a.push(o) - 1)
}
return a
}, [])
console.log(newInfo)
该代码的时间复杂度为 O( n ),因为我们使用的是地图。
(另外,这是我唯一见过push
的返回值有用的时候之一)
推荐阅读
- reactjs - 如何在每次渲染我们的特定渲染时使用 useEffect
- ruby-on-rails - Rest POST 在 CRON 任务中不起作用(它适用于手动 rake 命令)
- python - 如何旋转数据框以将多行折叠为一行
- azure - 使用一对多字段映射从多个集合创建天蓝色搜索索引
- sql - 最近的 TIMESTAMP 加入同一个表
- php - 使用复印机安装 wordpress 出错
- java - 检查条件进入 if 检查
- python - 有没有更短和/或更有效的方法在条件语句中利用数组?(在这种情况下是“if”语句)
- c - C语言读取上箭头键获取命令历史
- python - 这个函数可能存在线程安全问题吗?