Как я могу реструктурировать этот результат MongoDB в правильный формат? - PullRequest
0 голосов
/ 27 апреля 2018

Я опрашиваю монго примерно так:

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

С целью в конечном итоге сделать Object.assign(res.locals, ...newData), поэтому res.locals имеет свойство listOne и listTwo.

Я возился с картой вот так:

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-модули для этого или циклы для его повторной обработки, но я не могу не чувствовать, что есть более чистый / аккуратный способ вернуть его.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Вы можете использовать Array.reduce () для накопления результата.

'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: [{label: 'OptOne', стоимость: '25'}, {label: 'OptTwo', стоимость: '22'}], ListTwo: [{label: 'OptOne', стоимость: '25'}, {label: 'OptTwo', стоимость: '22'}]}

0 голосов
/ 27 апреля 2018

Вам нужно использовать уменьшить

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 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...