动态重组对象数组,每个对象包含两个属性值对

时间:2019-10-28 10:52:32

标签: javascript arrays javascript-objects

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

我真的很好奇看到您的反馈。我首先提取名称并删除重复项。留给我这样的数组:let waiterNames = ['John','Mark','Jess'].

然后我尝试使用double for循环并以某种方式创建对象的新数组,但是我陷入了困境。

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' }]

3 个答案:

答案 0 :(得分:1)

您可以在Math.round(number, numberDecimals) 旁边使用地图:

reduce

由于我们使用的是地图,因此这段代码的时间复杂度为O( n )。

(而且,这是我看到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)的返回值有用的唯一次数之一)

答案 1 :(得分:0)

最简单的方法是使用临时Map来跟踪您以前见过的服务员的对象,以便将其添加到工作日中。

const waiterMap = new Map();
const newInfo = [];
for (const {waiters, weekdays} of waiterInfo) {
    let entry = waiterMap.get(waiters);
    if (!entry) {
        // New waiter, create the object and put it in the map and result array
        const copy = {waiters, weekdays};
        waiterMap.set(waiters, copy);
        newInfo.push(copy);
    } else {
        // Existing entry, just add to it
        entry.weekdays += `, ${weekdays}`;
    }
}

实时示例:

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 waiterMap = new Map();
const newInfo = [];
for (const {waiters, weekdays} of waiterInfo) {
    let entry = waiterMap.get(waiters);
    if (!entry) {
        // New waiter, create the object and put it in the map and result array
        const copy = {waiters, weekdays};
        waiterMap.set(waiters, copy);
        newInfo.push(copy);
    } else {
        // Existing entry, just add to it
        entry.weekdays += `, ${weekdays}`;
    }
}

console.log(newInfo);

这避免了修改现有数据,但是如果您不关心waiterInfo,则可以重用原始对象。

答案 2 :(得分:-1)

您可以这样做:

const 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 result = Object
  .values(
    waiterInfo.reduce((a, { waiters, weekdays }) => {
      a[waiters] = a[waiters] || { waiters, weekdays: [] }
      a[waiters].weekdays.push(weekdays)
      return a
    }, {})
  )
  .map(({ waiters, weekdays }) => ({ waiters, weekdays: weekdays.join(', ') }))

console.log(result)