首页 > 解决方案 > 动态重组一个对象数组,每个对象包含两个属性值对

问题描述

我正在从数据库中提取数据并最终得到一组对象,每个对象都包含服务员姓名和他们工作的日子。我想通过将数组压缩为每个服务员具有两个属性值对的单个对象来动态重组数组。名称的一个属性和工作天数的另一个属性。

我真的很想看到你的反馈。我首先提取名称并删除重复项。给我留下这样的数组: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' }]

标签: javascriptarraysjavascript-objects

解决方案


您可以在旁边使用地图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的返回值有用的时候之一)


推荐阅读