Node.js 如何将MongoDB结果重新构造为正确的格式?

Node.js 如何将MongoDB结果重新构造为正确的格式?,node.js,object,Node.js,Object,我用这样的方式询问mongo: const loadedLists = await ListValues.find( {} ) result = [ { listname: 'ListOne', values: [ { label: 'OptOne', cost: '25' },{

我用这样的方式询问mongo:

  const loadedLists = await ListValues.find( {} )
result = [ { listname: 'ListOne',
             values: [ {
                         label: 'OptOne',
                         cost: '25'
                        },{
                         label: 'OptTwo',
                         cost: '22'
                        }]
           }, { listname: 'ListTwo',
                values: [...//and so on]
          }]
 const newData = 
      { listOne: [ { label: 'OptOne', cost: '25' }, { label ...} ],
        listTwo: [ { label: 'OptTwo', cost: '25' }, { label ...} ]}
const hh = {}
hh = result.map( async list => {
  return { [list.listName]: list.values }
}
hh = await Promise.all(hh)
[
  { listOne: [ ...//Properly has the values ] },
  { listTwo: [ ...//Same...]}
]
我得到的结果大致如下:

  const loadedLists = await ListValues.find( {} )
result = [ { listname: 'ListOne',
             values: [ {
                         label: 'OptOne',
                         cost: '25'
                        },{
                         label: 'OptTwo',
                         cost: '22'
                        }]
           }, { listname: 'ListTwo',
                values: [...//and so on]
          }]
 const newData = 
      { listOne: [ { label: 'OptOne', cost: '25' }, { label ...} ],
        listTwo: [ { label: 'OptTwo', cost: '25' }, { label ...} ]}
const hh = {}
hh = result.map( async list => {
  return { [list.listName]: list.values }
}
hh = await Promise.all(hh)
[
  { listOne: [ ...//Properly has the values ] },
  { listTwo: [ ...//Same...]}
]
我需要把它变成这样的对象:

  const loadedLists = await ListValues.find( {} )
result = [ { listname: 'ListOne',
             values: [ {
                         label: 'OptOne',
                         cost: '25'
                        },{
                         label: 'OptTwo',
                         cost: '22'
                        }]
           }, { listname: 'ListTwo',
                values: [...//and so on]
          }]
 const newData = 
      { listOne: [ { label: 'OptOne', cost: '25' }, { label ...} ],
        listTwo: [ { label: 'OptTwo', cost: '25' }, { label ...} ]}
const hh = {}
hh = result.map( async list => {
  return { [list.listName]: list.values }
}
hh = await Promise.all(hh)
[
  { listOne: [ ...//Properly has the values ] },
  { listTwo: [ ...//Same...]}
]
目标是最终执行
Object.assign(res.locals,…newData)
因此
res.locals
的属性为
listOne
listwo

我把地图弄乱了,像这样:

  const loadedLists = await ListValues.find( {} )
result = [ { listname: 'ListOne',
             values: [ {
                         label: 'OptOne',
                         cost: '25'
                        },{
                         label: 'OptTwo',
                         cost: '22'
                        }]
           }, { listname: 'ListTwo',
                values: [...//and so on]
          }]
 const newData = 
      { listOne: [ { label: 'OptOne', cost: '25' }, { label ...} ],
        listTwo: [ { label: 'OptTwo', cost: '25' }, { label ...} ]}
const hh = {}
hh = result.map( async list => {
  return { [list.listName]: list.values }
}
hh = await Promise.all(hh)
[
  { listOne: [ ...//Properly has the values ] },
  { listTwo: [ ...//Same...]}
]
它几乎可以工作,除了hh看起来像这样:

  const loadedLists = await ListValues.find( {} )
result = [ { listname: 'ListOne',
             values: [ {
                         label: 'OptOne',
                         cost: '25'
                        },{
                         label: 'OptTwo',
                         cost: '22'
                        }]
           }, { listname: 'ListTwo',
                values: [...//and so on]
          }]
 const newData = 
      { listOne: [ { label: 'OptOne', cost: '25' }, { label ...} ],
        listTwo: [ { label: 'OptTwo', cost: '25' }, { label ...} ]}
const hh = {}
hh = result.map( async list => {
  return { [list.listName]: list.values }
}
hh = await Promise.all(hh)
[
  { listOne: [ ...//Properly has the values ] },
  { listTwo: [ ...//Same...]}
]
我只需要把这些物体移动到一个高度。我已经找到了NPM模块来做这件事,或者找到了循环来重新处理它,但我忍不住觉得有一种更干净/整洁的方法可以让它返回。

你需要使用reduce

const loadedLists = await ListValues.find( {} )
const hh = loadedList.reduce(
  (acc, {listname, values}) => (acc[listname] = values, acc)
  {}
)
此外,您不需要将
async
关键字分散到所有位置。:)只有在使用
await
关键字的异步函数中使用它才有意义

代码中的示例

// why do you even need async here? there is nothing async in creating an object
hh = result.map( async list => {
  return { [list.listName]: list.values }
}
你需要使用reduce

const loadedLists = await ListValues.find( {} )
const hh = loadedList.reduce(
  (acc, {listname, values}) => (acc[listname] = values, acc)
  {}
)
此外,您不需要将
async
关键字分散到所有位置。:)只有在使用
await
关键字的异步函数中使用它才有意义

代码中的示例

// why do you even need async here? there is nothing async in creating an object
hh = result.map( async list => {
  return { [list.listName]: list.values }
}
您可以使用来累积结果

'use strict';

let data = [{
  listname: 'ListOne',
  values: [{
    label: 'OptOne',
    cost: '25'
  }, {
    label: 'OptTwo',
    cost: '22'
  }]
}, {
  listname: 'ListTwo',
  values: [{
    label: 'OptOne',
    cost: '25'
  }, {
    label: 'OptTwo',
    cost: '22'
  }]
}];


let result = data.reduce(function (acc, {listname, values}) {
  if (acc[listname]) {
    acc[listname] = acc[listname].concat(values);
  } else {
    acc[listname] = values;
  }
  return acc;
}, {});

console.log('result', result);
这个日志

结果{ListOne: [{标签:'OptOne',成本:'25'}, {标签:'OptTwo',成本:'22'}], 清单二: [{标签:'OptOne',成本:'25'}, {标签:'OptTwo',成本:'22'}]}

您可以使用来累积结果

'use strict';

let data = [{
  listname: 'ListOne',
  values: [{
    label: 'OptOne',
    cost: '25'
  }, {
    label: 'OptTwo',
    cost: '22'
  }]
}, {
  listname: 'ListTwo',
  values: [{
    label: 'OptOne',
    cost: '25'
  }, {
    label: 'OptTwo',
    cost: '22'
  }]
}];


let result = data.reduce(function (acc, {listname, values}) {
  if (acc[listname]) {
    acc[listname] = acc[listname].concat(values);
  } else {
    acc[listname] = values;
  }
  return acc;
}, {});

console.log('result', result);
这个日志

结果{ListOne: [{标签:'OptOne',成本:'25'}, {标签:'OptTwo',成本:'22'}], 清单二: [{标签:'OptOne',成本:'25'}, {标签:'OptTwo',成本:'22'}]}


哇,太棒了!谢谢我认为async是许多尝试以不同方式实现的结果之一。我就快到了。。。如果I res.json(hh)或console.log(hh),它看起来很完美,但当我尝试Object.assign(res.locals,…hh)时,它会说Undefined不是一个函数。知道为什么吗?忽略这一点。。我不知道我是想传播什么结果,而我不需要。。。尝试了太多不同的东西太久了。谢谢你的帮助!哇,太棒了!谢谢我认为async是许多尝试以不同方式实现的结果之一。我就快到了。。。如果I res.json(hh)或console.log(hh),它看起来很完美,但当我尝试Object.assign(res.locals,…hh)时,它会说Undefined不是一个函数。知道为什么吗?忽略这一点。。我不知道我是想传播什么结果,而我不需要。。。尝试了太多不同的东西太久了。谢谢你的帮助!