Веб-API для получения данных - PullRequest
0 голосов
/ 29 ноября 2018

Я создаю веб-API для извлечения данных из фиктивной базы данных, используя экспресс

Я хочу получить список JSON всех портфелей и позиций из модуля базы данных.Возможно ли возвращение данных в структурированном виде, чтобы у каждого портфеля было свойство с набором позиций, связанных с каждым?

 const portfolios = [
  {
    id: 1,
    name: "Investor 1"
  },
  {
    id: 2,
    name: "Investor 2"
  },

];

const positions = [
  {
    id: 1,
    portfolioId: 1,
    currency: "GBP",
    value: -2.02,
    date: "2018-06-07"
  },
  {
    id: 2,
    portfolioId: 1,
    currency: "EUR",
    value: 1906302.15,
    date: "2018-06-07"
  },
  {
    id: 3,
    portfolioId: 2,
    currency: "GBP",
    value: 1379804.1,
    date: "2018-06-07"
  },
  {
    id: 4,
    portfolioId: 2,
    currency: "CAD",
    value: 2401938.18,
    date: "2018-06-07"
  }
];

export default { portfolios, positions };

Это то, что у меня есть в моем маршрутизаторе

export default (app) => {
  app.get('/portfolio', (req, res) => {
    res.json({ portfolios });
  });
};

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вы можете использовать комбинацию map и filter.

portfolios.map (pf => ({...pf, positions: positions.filter (({portfolioId}) => pf.id == portfolioId)}))

. Или обобщить эту идею и использовать помощника для объединения ваших массивов.

function join (left, right, {joinKey,foreignKey, idKey='id'}) {
	return left.map (lI => ({...lI,[joinKey]: right.filter (rI => lI[idKey] == rI[foreignKey])}))
}
let joined = join (portfolios, positions, {joinKey: 'positions', foreignKey: 'portfolioId'})
console.log (joined)
<script>

const portfolios = [
  {
    id: 1,
    name: "Investor 1"
  },
  {
    id: 2,
    name: "Investor 2"
  },

];

const positions = [
  {
    id: 1,
    portfolioId: 1,
    currency: "GBP",
    value: -2.02,
    date: "2018-06-07"
  },
  {
    id: 2,
    portfolioId: 1,
    currency: "EUR",
    value: 1906302.15,
    date: "2018-06-07"
  },
  {
    id: 3,
    portfolioId: 2,
    currency: "GBP",
    value: 1379804.1,
    date: "2018-06-07"
  },
  {
    id: 4,
    portfolioId: 2,
    currency: "CAD",
    value: 2401938.18,
    date: "2018-06-07"
  }
];

</script>
0 голосов
/ 29 ноября 2018

Вы должны посмотреть на Лодаш .Он имеет много полезных функций, таких как filter для итерации по данным.

Это должно работать:

export default (app) => {
    app.get('/portfolio', (req, res) => {
        res.json(_.map(portfolios, portfolio => {
            return {
                id: portfolio.id,
                name: portfolio.name,
                positions: _.filter(positions, position => position.portfolioId == portfolio.id)
            }
        }));
    });
};

Обратите внимание, что я не делаю portfolio.positions = _.filter(...), иначе ссылка внутри portfolios будет изменено.Вы можете изучить _.clone(), если ваши портфели станут более сложными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...